我目前正在开展一个Qt项目,我在SLOT方面遇到了一些麻烦。 我想传递一个指向成员函数的指针作为SLOT的参数。为此,我在课堂上宣布了SLOT,但是当我这样做时,我得到了MOC错误。 我不知道我想达到的目标是否可能。
名为MainFrame的类的语法示例:
void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));
我没有任何连接,没有使用该功能,我唯一的错误是在上面这一行。
谢谢大家的帮助。我在网上找不到任何解决方案(但如果有人感兴趣,我发现这篇文章解释了SIGNAL and SLOT in depth。)
答案 0 :(得分:7)
为该指针指向成员类型声明一个typedef。
声明并注册该typedef的元类型。
仅使用typedef - 记住moc使用字符串比较来确定类型相等,它没有C ++类型表达式解析器。
以下是一个例子。在调用a.exec()
时,事件队列中有两个QMetaCallEvent
个事件。第一个是c.callSlot
,第二个是a.quit
。它们按顺序执行。回想一下,排队的呼叫(无论是由于invokeMethod
还是由于信号激活)导致为每个接收者发布QMetaCallEvent
。
#include <QCoreApplication>
#include <QDebug>
#include <QMetaObject>
class Class : public QObject {
Q_OBJECT
public:
typedef void (Class::*Method)(const QString &);
private:
void method(const QString & text) { qDebug() << text; }
Q_SLOT void callSlot(const QString & text, Class::Method method) {
(this->*method)(text);
}
Q_SIGNAL void callSignal(const QString & text, Class::Method method);
public:
Class() {
connect(this, SIGNAL(callSignal(QString,Class::Method)),
SLOT(callSlot(QString,Class::Method)),
Qt::QueuedConnection);
emit callSignal("Hello", &Class::method);
}
};
Q_DECLARE_METATYPE(Class::Method)
int main(int argc, char *argv[])
{
qRegisterMetaType<Class::Method>();
QCoreApplication a(argc, argv);
Class c;
QMetaObject::invokeMethod(&a, "quit", Qt::QueuedConnection);
return a.exec();
}
#include "main.moc"