Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QObject connection function

Tags:

I checked other similar questions and tried their solutions but they don't work for me.

I'm basically trying to make a http client that only makes post requests. In order to do this, I need to connect QNetworkManager's finished signal to some callback slot.

Here's my code.

h file:

... public slots:    void finishedSlot(QNetworkReply* reply); private:     QNetworkAccessManager *network_manager; ... 

cpp file:

... Class1::Class1(){     network_manager = new QNetworkAccessManager(this);     QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *))); } ... void Class1::finishedSlot(QNetworkReply* reply) {     // some logic with reply } ... 

As you can see, the slot is definitely present and it is declared under public slots in header file. So I have no idea why this is happening. I already tried clean, run qmake, and rebuild.

The error message is:

"QObject::connect: No such slot QObject::finishedSlot(QNetworkReply *)"

Any idea?

like image 403
CTheDark Avatar asked Nov 10 '13 06:11

CTheDark


People also ask

What is QObject :: connect?

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) Creates a connection of the given type from the signal in the sender object to the method in the receiver object.

What is a QObject?

The QObject class is the base class of all Qt objects. QObject is the heart of the Qt Object Model. The central feature in this model is a very powerful mechanism for seamless object communication called signals and slots. You can connect a signal to a slot with connect() and destroy the connection with disconnect().

How does signal connect to signal in Qt?

To connect the signal to the slot, we use QObject::connect(). There are several ways to connect signal and slots. The first is to use function pointers: connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);


2 Answers

You probably forgot to use the Q_OBJECT macro. Every class that implements its own slots/signals needs that macro. Don't forget that you need to add your header/source file to the .pro file.

like image 109
Zeta Avatar answered Nov 07 '22 22:11

Zeta


One thing to note; since you're using Qt 5, there's a new signal slot connection syntax, which will allow you to specify any function and not just those defined as slots.

In this situation you can do this: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot); 

What's great about this syntax is that you just specify the address of the function and don't bother about the parameters, so if you change them in a function, you don't need to update them in the connect statements.

You still should be using the Q_OBJECT macro though and you can read more about the new syntax here.

like image 42
TheDarkKnight Avatar answered Nov 07 '22 21:11

TheDarkKnight