C++ QT插槽:指向成员函数的指针错误
我目前正在从事一个Qt项目,我在插槽方面遇到了一些问题。 我想传递一个指向成员函数的指针作为插槽的参数。为此,我在类中声明了插槽,但当我这样做时,我得到了MOC错误。 我不知道我想实现的目标是否可能 名为MainFrame的类的语法示例: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)); 我没有任何连接,没有使用该函数,我唯一的错误是在上面这一行 谢谢大家的帮助。我在网上找不到任何解决方案(但我
void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));
我没有任何连接,没有使用该函数,我唯一的错误是在上面这一行
谢谢大家的帮助。我在网上找不到任何解决方案(但我发现这篇文章解释了是否有人感兴趣)
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是私有的”。