Signals and slots Connect
-
Hi All,
If I have two forms, mainview and profilesearch, and am setting up a signal and slot between them.
What should the connectallline look like?
The current issue I'm having is i'm using "this" twice in the send object and the receive object. This is the error I get:
"QObject::connect: No such slot ProfileSearch::printData(QString) in ..\profilesearch.cpp:80
QObject::connect: (sender name: 'ProfileSearch')
QObject::connect: (receiver name: 'ProfileSearch')"This makes sense because I'm trying to connectl from profilesearch to profilesearch. But the class member function printData(QString); belongs to mainview. This brings me to my questions what should I replace the second "this" in the connect line of code? I've tried "MainView", "mainview", "MainView::mainview" Nothing I've tried works. What am I missing here?
The following code only includes what I think should be stuff pertaining to my question. (I cut the fat)
mainview.h
private slots: void printData(QString);
mainview.cpp
MainView::MainView(QWidget *parent) : QDialog(parent), ui(new Ui::MainView) { ui->setupUi(this); } void MainView::printData(QString tnum) { ui->LbltNum->setText(tnum); }
profile.h
signals: void sendData(QString);
profilesearch.cpp
void ProfileSearch::on_btnOk_clicked() { connect(this, SIGNAL(sendData(QString)), this, SLOT(printData(QString))); emit sendData("test"); qDebug() << "Ok button clicked."; }
-
Hi
-What am I missing here?
That you need a actual pointer to the widgets. So
unless you give ProfileSearch a pointer to the MainView, it cant work.You should connect in MainView instead.
Where you create ProfileSearch to show it.There you know both objects
void MainView::ShowProfileSearch() { ProfileSearch ps; connect(&ps, SIGNAL(sendData(QString)), this, SLOT(printData(QString))); ps.exec(); }
Alternatively, you can cast the parent of ShowProfileSearch if its MainView and connect that way. Its slightly ugly though.
-
@Core2
You are welcome :)it takes some time to get used to design/program
with signals and slots.
It can be a bit of a challenge to have pointers to both objects in same place but often the mainwindow is a good place.Note that its also ok to connect signal to signal.
This can be used to surface some signals from inside a class to outside world.
Like if you have a dialog with an TextEdit. The textEdit is private so outside cannot
connect directly to it.
You can then connect signal to a new public signal and the outside world can connect to this new signal. ( like TextReady)The good thing about this is that if you one day change the TextEdit to a combobox, the rest of the program do not need to change. It will still get the data via the new public signal TextReady.
In a non trivial program, such encapsulation/hiding of details is
worth every penny.