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

Dan Milburn danmilburn at clara.co.uk
Fri Feb 5 09:21:00 CET 2010


> 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())");

If that line is exactly what you're doing, then there's a good reason 
it's not working.  You've put "SLOT" in a string literal, when what you 
actually wanted to do was use the SLOT macro.

What you need is either:

MakeMenu( menu, SLOT(handleMenuItems()), items );
followed by

MakeMenu( QMenu *menu, const char *slot, items )
{
     ...
     connect( button, SIGNAL(triggered()), this, slot );
}

or use MakeMenu( menu, "handleMenuItems()", items ); and use the SLOT 
macro at the point of the connect call.

Dan

> 
> 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.



More information about the Qt-interest-old mailing list