QT SLOT:成员函数指针错误

use*_*997 4 c++ qt member-function-pointers signals-slots slot

我目前正在开发一个Qt项目,我在SLOT方面遇到了一些麻烦.我想传递一个指向成员函数的指针作为SLOT的参数.为此,我在课堂上宣布了SLOT,但是当我这样做时,我得到了MOC错误.我不知道我想要达到的目标是否可行.

名为MainFrame的类的语法示例:

void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));
Run Code Online (Sandbox Code Playgroud)

我没有任何连接,没有使用该功能,我唯一的错误是在上面的这一行.

谢谢大家的帮助.我在网上找不到任何解决方案(但是如果有人感兴趣,我发现这篇文章深入解释了SIGNAL和SLOT).

Rei*_*ica 7

  1. 为该指针指向成员类型声明一个typedef.

  2. 声明并注册该typedef的元类型.

  3. 只使用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"
Run Code Online (Sandbox Code Playgroud)