[Qt-interest] Question SLOT Macro & messing with the QObject::connect method

Eirik Ulvik eiriku at simsurgery.com
Fri Feb 5 10:54:57 CET 2010


I was in just your same position when I wanted to create objects and 
connections based on a XML file. Of course the macros are only valid at 
compile time so I ended up doing exactly what you have done. I must say 
I felt quite "dirty" afterwards, it just is a fugly hack to get stuff to 
work, but it DOES work.

Eirik

Den 04.02.2010 21:01, skrev kent williams:
> Yes. That's what I tried before I started reading the Qt headers to
> figure out what I actually needed to do.  If you do something like
> this:
>
> connect(button,SIGNAL(triggered()),this,"SLOT(handleMenuItems())");
>
> Then you get a message like this:
>
> Object::connect: Use the SLOT or SIGNAL macro to connect
> BTMainWindow::SLOT(handleMenuItems())
>
> Because what QObject::connect actually needs to do its job is
>
> connect(button,SIGNAL(triggered()),this,"1handleMenuItems()");
>
>
> On Thu, Feb 4, 2010 at 1:53 PM, Jefferson Bandeira<jbsilva at ufrj.br>  wrote:
>    
>> Have you tried passing SLOT(handleMenuItems()) as an argument insteaf of
>> "handleMenuItems()"?
>>
>> 2010/2/4 kent williams<nkwmailinglists at gmail.com>
>>      
>>> I just have the habit of turning any block of code I need to use over
>>> and over again into a convenience function.  I'd think EVERYONE would
>>> want to have that habit, but when I read other people's code it sure
>>> seems like they're a lot more excited by Cut&  Paste in their editor
>>> than they are about functional decomposition as a programming
>>> technique.
>>>
>>> Anyway Creating menus is one of those things I do more than once, so I
>>> made it a function.
>>>
>>> So in my code I have something like this:
>>>
>>> QMenu *menu = new QMenu(this); // this being the main window of the
>>> application
>>> const char *items[] = { "First Item", "Second Item", "Third Item", 0 };
>>> this->MakeMenu(menu, "handleMenuItems()", items);
>>>
>>> I COULD create actions one at a time and add them to the menu, but in
>>> this case, I just have to write 3 lines of code. Plus, if I want to
>>> change something about how my menus are constructed, I only have to
>>> fix the MakeMenu method, not change the code every place I make a
>>> menu.
>>>
>>> What it really boils down to is this: Qt defines this method for QObject:
>>> bool QObject::connect( const QObject * sender,
>>>                                   const char * signal,
>>>                                   const QObject * receiver,
>>>                                   const char * method,
>>>                                   Qt::ConnectionType type =
>>> Qt::AutoConnection );
>>>
>>> But the strings for the parameter signal and method encode their type
>>> with a prepended '1', '2', or '3'.  Now I've been programming
>>> computers since 1983, I really have no trouble prepending a digit on
>>> my signal/slot string.  What I was asking is this:
>>>
>>> Is there a better way to do this that is more consistent with the
>>> spirit of Qt, or did the Qt authors figure people would just read the
>>> headers and hack it together the way I did?
>>>
>>> On Thu, Feb 4, 2010 at 1:19 PM, Jefferson Bandeira<jbsilva at ufrj.br>
>>> wrote:
>>>        
>>>> I really can't see what exactly you're trying to do with that piece of
>>>> code,
>>>> are you trying to introduce Custom Slots at runtime? 'Cause i think it's
>>>> not
>>>> supported at all, if it's not this, could you clarify a bit what exactly
>>>> are
>>>> you trying to do?
>>>>
>>>> 2010/2/4 kent williams<nkwmailinglists at gmail.com>
>>>>          
>>>>> I don't think you understand what Slot does.
>>>>>
>>>>> #define SLOT(a) "1"#a
>>>>>
>>>>> # is the preprocessor 'stringify' operation.  It takes the argument
>>>>> and turns it into a string literal. For example
>>>>> SLOT(kickme())
>>>>>
>>>>> is turned by the C Preprocessor into
>>>>>
>>>>> "1" "kickme()"
>>>>>
>>>>> and since adjacent string literals are merged, it will become
>>>>>
>>>>> "1kickme()"
>>>>>
>>>>> So you can _ONLY_ use the SLOT macro at compile time.
>>>>>
>>>>> At runtime, say, if you want to stick a bunch of boilerplate Qt code
>>>>> into a convenience function, you just can't use SLOT(), because
>>>>> there's no way to go from a passed const char * parameter back to a
>>>>> string literal to use for a SLOT parameter.  You  can fake it -- which
>>>>> is what I do -- create a string at runtime with a literal '1'
>>>>> prepended.
>>>>>
>>>>> The problem, as I see it, is that with respect to proper C++ the
>>>>> SIGNAL/SLOT/METHOD business is stuck in the compile-time realm, even
>>>>> the the whole POINT of Qt's Signals and Slots paradigm is that the
>>>>> connections between signals and slots happen at runtime!
>>>>>
>>>>>
>>>>> On Thu, Feb 4, 2010 at 11:17 AM, Ian Thomson<Ian.Thomson at iongeo.com>
>>>>> wrote:
>>>>>            
>>>>>> Hi,
>>>>>>
>>>>>> kent williams wrote:
>>>>>>              
>>>>>>> So my question is this: is there a non-evil way to get around SLOT()
>>>>>>> requiring a string literal instead of a char * variable?
>>>>>>>                
>>>>>> Isn't the const char* you're talking about a literal somewhere else
>>>>>> in
>>>>>> your
>>>>>> program? Call SLOT() on it there.
>>>>>>
>>>>>>
>>>>>> Cheers,
>>>>>> Ian.
>>>>>>
>>>>>>              
>>>>> _______________________________________________
>>>>> Qt-interest mailing list
>>>>> Qt-interest at trolltech.com
>>>>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>>>>            
>>>>
>>>>
>>>> --
>>>> Jefferson Bandeira
>>>>
>>>>
>>>> _______________________________________________
>>>> Qt-interest mailing list
>>>> Qt-interest at trolltech.com
>>>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>>>
>>>>
>>>>          
>>> _______________________________________________
>>> Qt-interest mailing list
>>> Qt-interest at trolltech.com
>>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>>        
>>
>>
>> --
>> Jefferson Bandeira
>>
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at trolltech.com
>> http://lists.trolltech.com/mailman/listinfo/qt-interest
>>
>>
>>      
> _______________________________________________
> Qt-interest mailing list
> Qt-interest at trolltech.com
> http://lists.trolltech.com/mailman/listinfo/qt-interest
>    



More information about the Qt-interest-old mailing list