I'm currently working on a Qt project and I have some troubles with SLOTs. I want to pass a pointer to member function as an argument of a SLOT. To do this, I declared the SLOT in my class but when I do so, I get MOC error. I don't know if what I want to achieve is even possible.
An exemple of syntax for a class named MainFrame:
void slotAnswerReceived (QString answer, void (MainFrame::*ptr)(QString));
I don't have any connect anywhere, nothing using that function, and the only error I have is on this line above.
Thank you everyone for the help. I cannot find any solution on the web (but I found this article explaining SIGNAL and SLOT in depth if someone is interested).
Declare a typedef for that pointer-to-member type.
Declare and register the metatype for that typedef.
Only use the typedef - remember that moc uses string comparison to determine type equality, it has no C++ type expression parser.
An example follows. At the time a.exec()
is called, there are two QMetaCallEvent
events in the event queue. The first one is to c.callSlot
, the second one is to a.quit
. They are executed in order. Recall that a queued call (whether due to invokeMethod
or due to a signal activation) results in posting of a QMetaCallEvent
for each receiver.
#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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With