[Qt-interest] Question SLOT Macro & messing with the QObject::connect method
kent williams
nkwmailinglists at gmail.com
Thu Feb 4 18:05:30 CET 2010
I wanted to use a private method in my MainWindow class to encapsulate
some of the Qt boilerplate with respect to building menus.
After fiddling about I ended up with this:
// theMenu -- menu to add actions to
// theAction -- function to connect to triggered
//
void
BTMainWindow::
MakeMenu(QMenu *theMenu,const char *theAction,const char **labels)
{
std::string _action("1"); // EVIL HACKING -- fake the SLOT macro
_action += theAction; //
for(unsigned i = 0; labels[i] != 0; i++)
{
QAction *tempAction = new QAction(tr(labels[i]),this);
theMenu->addAction(tempAction);
connect(tempAction,SIGNAL(triggered()),this,
_action.c_str());
}
}
Now because I'm a new Qt users, when I looked at the QObject
documentation, I originally thought I could just pass in a string
literal to QObject::connect to specify the slot. Turns out that
really doesn't work -- I kept getting warnings saying stuff like this:
Object::connect: Use the SLOT or SIGNAL macro to connect
BTMainWindow::loadTrace()
So I went looking in the Qt Headers and found this in qobjectdefs.h:
#ifndef QT_NO_DEBUG
# define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)
# define METHOD(a) qFlagLocation("0"#a QLOCATION)
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
#else
# define METHOD(a) "0"#a
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
#endif
So in order to fake the SLOT macro, just prepend "1" to your string
and pass it to QObject::connect.
Now to my way of thinking, this is an evil peeking-behind-the-curtain
sort of thing to do -- what if some future version of Qt needs to
change the SLOT macro?Any code faking SLOT will stop working.
So my question is this: is there a non-evil way to get around SLOT()
requiring a string literal instead of a char * variable?
More information about the Qt-interest-old
mailing list