Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT插槽:指向成员函数的指针错误_C++_Qt_Signals Slots_Member Function Pointers_Slot - Fatal编程技术网

C++ QT插槽:指向成员函数的指针错误

C++ QT插槽:指向成员函数的指针错误,c++,qt,signals-slots,member-function-pointers,slot,C++,Qt,Signals Slots,Member Function Pointers,Slot,我目前正在从事一个Qt项目,我在插槽方面遇到了一些问题。 我想传递一个指向成员函数的指针作为插槽的参数。为此,我在类中声明了插槽,但当我这样做时,我得到了MOC错误。 我不知道我想实现的目标是否可能 名为MainFrame的类的语法示例: void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString)); 我没有任何连接,没有使用该函数,我唯一的错误是在上面这一行 谢谢大家的帮助。我在网上找不到任何解决方案(但我

我目前正在从事一个Qt项目,我在插槽方面遇到了一些问题。 我想传递一个指向成员函数的指针作为插槽的参数。为此,我在类中声明了插槽,但当我这样做时,我得到了MOC错误。 我不知道我想实现的目标是否可能

名为MainFrame的类的语法示例:

void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));
我没有任何连接,没有使用该函数,我唯一的错误是在上面这一行

谢谢大家的帮助。我在网上找不到任何解决方案(但我发现这篇文章解释了是否有人感兴趣)

  • 为指向成员类型的指针声明typedef

  • 声明并注册该typedef的元类型

  • >p>只使用TyErfFF——记住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"
    
    #包括
    #包括
    #包括
    类:公共QObject{
    Q_对象
    公众:
    typedef void(类::*方法)(常量QString&);
    私人:
    void方法(constqstring&text){qDebug()*方法(text);
    }
    Q_SIGNAL void callSignal(常量QString&text,Class::Method);
    公众:
    类(){
    connect(这个,信号(callSignal(QString,Class::Method)),
    SLOT(callSlot(QString,Class::Method)),
    Qt::QueuedConnection);
    发出调用信号(“Hello”、&Class::method);
    }
    };
    Q_DECLARE_元类型(类::方法)
    int main(int argc,char*argv[])
    {
    qRegisterMetaType();
    qcorea应用程序(argc、argv);
    丙级;;
    QMetaObject::invokeMethod(&a,“quit”,Qt::QueuedConnection);
    返回a.exec();
    }
    #包括“main.moc”
    
    只是一个小问题:为什么要传递指针作为参数?会出现什么错误?可能,您忘记为函数指针类型调用Q_DECLARE_METATYPE/qRegisterMetatype?[debug/moc_MainFrame.cpp]错误1。没有听说过Q_DECLARE_元类型(我会看看)。我知道我可以将这个函数的声明公开,并且它可以工作,但是由于这个错误,我不能将它用作插槽。我正在使用一个QTcpServer,当我收到一个答案时,我也得到了一个指针,它给了我下一个要调用的函数;但它指出编译错误:“QMainWindow是私有的”。