假设我有一个包含“function()”的字符串,其中function()是类中的一个插槽,我想将该插槽与任何信号连接,但使用该字符串。既不
QString f="function()";
connect (randomobject, SIGNAL(randomsignal()), this, SLOT(f));
output: just says that slot f doesn't exist.
或
QString f="SLOT(function())";
//conversion to const char*
connect (randomobject, SIGNAL(randomsignal()), this, f);
output: Use the SLOT or SIGNAL macro to connect
的工作。
有没有办法做类似的事情?重要的是它是一个字符串而不是函数指针。
答案 0 :(得分:4)
您可以在qobjectdefs.h中查看SLOT的定义:
#ifndef QT_NO_DEBUG
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
#else
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
#endif
这意味着SLOT(“func()”)在预处理后只需转换为“1func()”。 所以你可以写:
Test *t = new Test; // 'Test' class has slot void func()
QString str = "func()";
QPushButton *b = new QPushButton("pressme");
QObject::connect(b, SIGNAL(clicked()), t, QString("1" + str).toLatin1()); // toLatin1 converts QString to QByteArray
当您显示按钮并按下它时,将调用Test中的slot func()。
请注意,'connect'将'const char *'作为第二个和第四个参数类型,因此您必须将QString转换为'const char *'或'QByteArray'(将被转换为char指针)。