Qt连接没有SLOT宏

时间:2014-04-18 18:18:16

标签: c++ qt signals slot

假设我有一个包含“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 

的工作。

有没有办法做类似的事情?重要的是它是一个字符串而不是函数指针。

1 个答案:

答案 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指针)。