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?
[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.
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().
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);
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.
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.
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