Error: no matching function for call to 'QObject::connect
-
Hi,
I'm building a simple program to learn how to use widgets, layouts, etc without using the designer but ran through a problem. Basically, the program is designed to have a typical main and MainWindow but instead of having all gui code in MainWindow, I have a class called MainWindowContent which builds the gui and returns the layout containing all the widgets which is added to MainWindow's central widget.
#include "mainwindowcontent.h" MainWindowContent::MainWindowContent() { } QGridLayout* MainWindowContent::getPageWidgetsLayout() { QGridLayout *gridLayout =new QGridLayout(); QLabel *label = new QLabel(""); QLineEdit *lineEdit = new QLineEdit("Enter Text!"); QPushButton *button = new QPushButton("OK!"); QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton(label, lineEdit))); gridLayout->addWidget(label,0,0); gridLayout->addWidget(lineEdit,1,1); gridLayout->addWidget(button,2,2); return gridLayout; } //slot to handle button clicks void MainWindowContent::handleButton(QLabel* label,QLineEdit *lineEdit) { label->setText(lineEdit->text()); }
I keep getting
error: no matching function for call to 'QObject::connect(QPushButton*&, const char*, MainWindowContent*, const char*)'
QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton(label, lineEdit))); -
@WhatIf said in error: no matching function for call to 'QObject::connect:
QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton(label, lineEdit)));
Hi
That is not correct.
The clicked() signal do not have a label and lineEdit as parameters so you cannot connect like that.
the signal must have those parameters too.Can i ask what the logic should be ?
-
QObject::connect(button, &QPushButton::clicked,this, std::bind(&MainWindowContent::handleButton,this,label,lineEdit));
-
private slots: void handleButton();
QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));
void MainWindowContent::handleButton() { //label->setText(lineEdit->text()); }
error: no matching function for call to 'QObject::connect(QPushButton*&, const char*, MainWindowContent*, const char*)'
QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));I also tried
QObject::connect(button, &QPushButton::clicked,this, std::bind(&MainWindowContent::handleButton,this,label,lineEdit));
and got
error: no matching function for call to 'QObject::connect(QPushButton*&, void (QAbstractButton::)(bool), MainWindowContent, std::_Bind_helper<false, void (MainWindowContent::)(QLabel, QLineEdit*), MainWindowContent*, QLabel*&, QLineEdit*&>::type)'
QObject::connect(button, &QPushButton::clicked,this, std::bind(&MainWindowContent::handleButton,this,label,lineEdit)); -
Hi, maybe you forgot to inherit from QObject or QWidget, i.e. your mainwindowcontent.h should look something like this:
#pragma once #include "qobject.h" class MainWindowContent : QObject { Q_OBJECT public: MainWindowContent(); private slots: void handleButton(QLabel* label,QLineEdit *lineEdit); }
-
@WhatIf said in error: no matching function for call to 'QObject::connect:
I also tried
QObject::connect(button, &QPushButton::clicked,this, std::bind(&MainWindowContent::handleButton,this,label,lineEdit));and got
error: no matching function for call to 'QObject::connect(QPushButton*&, void (QAbstractButton::)(bool), MainWindowContent, std::_Bind_helper<false, void (MainWindowContent::)(QLabel, QLineEdit*), MainWindowContent*, QLabel*&, QLineEdit*&>::type)'
QObject::connect(button, &QPushButton::clicked,this, std::bind(&MainWindowContent::handleButton,this,label,lineEdit));read the error.
(MainWindowContent::)(QLabel, QLineEdit*)
did you forget a*
next toQLabel
in handleButton? -
I forgot to subclass QObject!
Now the program compiles but the slot is never called. here is how the code looks at this point.
signals: private slots: void handleButton(); //handles button clicks
QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));
void MainWindowContent::handleButton() { qDebug() << "INSIDE SLOT!"; }
-
Hi
try with
qDebug () << "conn:" << QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));
and see it says
conn: true -
Hi, also to add to @mrjj, perhaps the slot is never called because the button isn't visible, you could try insert a show() just after you've created the button, say like this:
QPushButton* button = new QPushButton("OK!"); button->show(); QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));
-
qDebug () << "conn:" << QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton()));
shows conn: true
using
button->show();
doesn't change anything.Basically, main.cpp calls mainwindow.cpp to get the central widget. mainwindow.cpp in turn calls mainwindowcontent.cpp to get the layout to set as centralwidget's.
I'm passing "this" (connect 3rd argument) of mainwindowcontent.cpp to the connect statement.
Will this make the connect work when mainwindowcontent.cpp returns the layout to mainwindow.cpp?
-
Hi,
Did you check whether you have any warning at run time ?
How do you know it's not getting called ? Did you put a breakpoint in your slot or a
qDebug
statement ? -
Then a silly question: how are you ensuring that you are clicking on the correct button ?
-
-
What's the lifetime of your
MainWindowContent
instance?It looks to me that
MainWindowContent::getPageWidgetsLayout()
could be entirelystatic
(if you wanted it to be) except for thethis
in theconnect
call. So if, for example, yourMainWindowContent
instance is destroyed, and re-created later, the slot will have been automatically disconnected, and not reconnected.Just something else to check...
Cheers.
-
main.cpp
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.buildPage(); w.show(); return a.exec(); }
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QLabel> #include <QHBoxLayout> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::buildPage() { MainWindowContent winContent; ui->centralWidget->setLayout(winContent.getPageWidgetsLayout()); }
mainwindowcontent.cpp
#include "mainwindowcontent.h" #include <QDebug> MainWindowContent::MainWindowContent(QObject *parent) : QObject(parent) { } QGridLayout* MainWindowContent::getPageWidgetsLayout() { QGridLayout *gridLayout =new QGridLayout(); QLabel *label = new QLabel(""); QLineEdit *lineEdit = new QLineEdit("Enter Text!"); QPushButton *button = new QPushButton("OK!"); QObject::connect(button, SIGNAL (clicked()),this, SLOT (handleButton())); gridLayout->addWidget(label,0,0); gridLayout->addWidget(lineEdit,1,1); gridLayout->addWidget(button,2,2); return gridLayout; } void MainWindowContent::handleButton() { qDebug() << "INSIDE SLOT!"; }
-
The problem is with the
winContent
lifetime.void MainWindow::buildPage() { MainWindowContent winContent; ui->centralWidget->setLayout(winContent.getPageWidgetsLayout()); // at this point, winContent is destroyed, and automatically disconnected. }
You probably want to do something more like:
void MainWindow::buildPage() { MainWindowContent * winContent = new MainWindowContent(this); ui->centralWidget->setLayout(winContent->getPageWidgetsLayout()); }
Or move the slot to the
MainWindow
class.Cheers.