QObject connection function
Solution 1
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.
Solution 2
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.
Solution 3
I share another possible problem here as this post is the top most in google search.
In addition to add Q_OBJECT
, you must also add public slots:
or public Q_SLOTS:
for your customized event. Otherwise, you'll still encounter the QObject::connect: No such slot
error.
I give a brief summary here according to Zeta's post and the other post
To solve “No such slot” error
, you must check..
- Check if your class inherits
QObject
or any derived class from QObject- Append
Q_OBJECT
macro inside the class definition- Append
slots
orQ_SLOTS
after your private/protected/public keyword for your event- If you do check 1-3, then clean, run qmake, and rebuild again to make sure all your things in 1-3 are generated by moc.
Finally, a example here:
class MyClass: public QObject { //check 1
Q_OBJECT //check 2
public slots: //check 3
void onEvent(int);
};
Hope this saves others' life
Related videos on Youtube
CTheDark
Updated on February 01, 2020Comments
-
CTheDark over 4 years
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?
-
peppe over 10 yearsNotice that the error says QObject::finishedSlot. That means Qt doesn't know about your subclass. That means meta information about it wasn't generated. That means
moc
wasn't run on your class. That means your class is lacking theQ_OBJECT
macro. -
peter70 about 6 yearsYou must not forget to specify your slot function (in the header file) in the "slots:" area
-
-
CTheDark over 10 yearsThanks a lot. I also had to clean/qmake/rebuild after adding that.
-
igleyy over 10 yearsCould you tell us if such a function has to be declared as static?
-
TheDarkKnight over 10 yearsThe function does not need to be static, as a pointer to the instance is passed to the connect call.
-
igleyy over 10 yearsOuuuwww, you're right! Before
&Class1::finishedSlot
we passthis
. I just forgot all my Qt experiences :). -
Kuba hasn't forgotten Monica over 10 years@Charlemagne: Merely re-running quake on the project would have sufficed, I think. This can save time on large projects.
-
Jatin over 8 years@TheDarkKnight: Certainly helpful.! The error was just due to non-usage of this new syntax.