Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QT SLOT: Pointer to Member Function error

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).

like image 910
user3429997 Avatar asked Mar 20 '23 03:03

user3429997


1 Answers

  1. Declare a typedef for that pointer-to-member type.

  2. Declare and register the metatype for that typedef.

  3. 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"
like image 59
Kuba hasn't forgotten Monica Avatar answered Mar 31 '23 17:03

Kuba hasn't forgotten Monica