我目前正在从事 Qt 项目,但在使用 SLOT 时遇到了一些麻烦。
我想将指向成员函数的指针作为 SLOT 的参数传递。为此,我在类(class)中声明了 SLOT,但是当我这样做时,我收到了 MOC 错误。
我不知道我想要达到的目标是否可能。

名为 MainFrame 的类的语法示例:

void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));

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

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

最佳答案

  • 为指向成员的指针类型声明一个 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"
    

    关于c++ - QT 插槽 : Pointer to Member Function error,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22607950/

    10-11 12:19