Function with Signals & Slots
-
Hi,
I have the following code:
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool))); qDebug() <<"The image path is (in main): " << fileName; QString Additem::findimage(bool) { qDebug() << "Find image signal works!"; Image_Button->setStyleSheet ("QPushButton{" "background-color:rgb(76, 255, 190);" "border-style: outset;" "border-width: 2px;" "border-radius: 10px;" "border-color: beige;" "font: bold 14px;" "min-width: 10em;" "padding: 6px;}" ); QString sPath = "C:/"; QFileDialog *fileDialog = new QFileDialog; fileName = fileDialog->getOpenFileName(this, tr("Finding Friend's Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)")); qDebug() << "(findimage) The image path is " << fileName; return(fileName);
How can I use the returned function value (fileName) in the line following the
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
line?
Thank you for your help. -
hi
You connect directly the button clicked to the slot findimage
so there is no way to return anything to the button. (the caller)You should let the slot call findimage, not be the slot.
so
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(SetMyStyle(bool)));void GetImage::SetMyStyle(bool) {
QString img=findimage(false);
.... rest of code
} -
You could do as the above comment says, or you could just use the new signal and slot syntax and use a lambda as the "slot". In the lambda you could just call that function and store the results, or use them with something else. For instance:
connect(imageButton, &QPushButton::clicked, [this]() { imagePath = findImage(); });
If it's something simple as the code above, I prefer to just use lambdas. Either way, I really prefer the newer syntax anyways.
-
Hi,
I have the following code:
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool))); qDebug() <<"The image path is (in main): " << fileName; QString Additem::findimage(bool) { qDebug() << "Find image signal works!"; Image_Button->setStyleSheet ("QPushButton{" "background-color:rgb(76, 255, 190);" "border-style: outset;" "border-width: 2px;" "border-radius: 10px;" "border-color: beige;" "font: bold 14px;" "min-width: 10em;" "padding: 6px;}" ); QString sPath = "C:/"; QFileDialog *fileDialog = new QFileDialog; fileName = fileDialog->getOpenFileName(this, tr("Finding Friend's Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)")); qDebug() << "(findimage) The image path is " << fileName; return(fileName);
How can I use the returned function value (fileName) in the line following the
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
line?
Thank you for your help.@gabor53 You should read again about Qt signals/slots. They are used for asynchronous communication and to react on user interactions. That means if you connect the clicked() signal of a button to a slot that slot will be called when user presses the button. You cannot know when it will happen (for sure not just after connect(...))! So, your current approach does not make any sense.
You could use another signal and pass the path to the image file as parameter. Then connect a slot to this signal and do what ever you need to do with the image. Or you do everything in findimage(). -
Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.
Qstring m_fileName; // A) in the header for the class
// inside function
Qstring tempFileName; // B) at top of function containing following line
tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
// now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions -
-
Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.
Qstring m_fileName; // A) in the header for the class
// inside function
Qstring tempFileName; // B) at top of function containing following line
tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
// now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions@Lineaxe What is this?
tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName));
connect(...) does not call the slot, it returns a bool signalling whether signal was connected to the slot or not. So your code will not even compile.
-
Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.
Qstring m_fileName; // A) in the header for the class
// inside function
Qstring tempFileName; // B) at top of function containing following line
tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
// now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions -
right , I should have taken the tempFileName= out , it isn't even needed ...Hmm , looking over a code a bit closer
QString Additem::findimage(bool)
return(fileName);
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
It looks like findimage returns a filename , not a SLOT , so this code would not work. I guess the only way that it could potentially work is if it had a list of slotnames in the QString and it returned them to connect. ( I am really just getting to know the QT environment, as well) . I must say I do like the concept of signals and slots vs events & triggers.
-
Now in his original code for the slot he is using (findimage(bool)) , in the function code he can sure fileName is declared either public or private in the class's header ( m_fileName for example ) so that all the Additem's other class functions will have access to it. Get and Set accessor functions are commonly used with class variables (for many reasons I have discovered) .
QString Additem::findimage(bool)
m_fileName = fileDialog->getOpenFileName(this,
tr("Finding Friend's Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)"));return m_fileName;
-
The thing is:
connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool))); qDebug() <<"The image path is (in main): " << fileName;
- it doesn't matter where fileName (or m_fileName) is declared, after the connect(...) call it will not be set yet because the findimage(bool) slot was not yet called. It will be called when the user clicks on the button - and you never know when the user will click the button.
-
Thank you all. Now I understand what's wrong. After the user clicks Image_Button, I want to display the image in a grid layout in which the Image_Button is. Is there a way I can go back to the grid layout AFTER the user clicked Image_Button and insert the choosen image next to the button?
-
Hi if u use @JordanHarris smart version,
you could do something like
connect(imageButton, &QPushButton::clicked, this {
imagePath = findImage();
QPixmap pic(imagePath);
ui->SomeQLabel->setPixmap(pic);
});you must insert the "SomeQLabel" into the layout. (just a normal Qlabel)
-
Hi if u use @JordanHarris smart version,
you could do something like
connect(imageButton, &QPushButton::clicked, this {
imagePath = findImage();
QPixmap pic(imagePath);
ui->SomeQLabel->setPixmap(pic);
});you must insert the "SomeQLabel" into the layout. (just a normal Qlabel)
@mrjj ,
I implementedconnect(Image_Button, &QPushButton::clicked, [this]() { imagePath = findimage(); })
and I got the following error message:
C:\Programming\backup\Folkfriends\additem.cpp:195: error: no match for 'operator=' (operand types are 'QString' and 'void')
connect(Image_Button, &QPushButton::clicked, this { imagePath = findimage(); });
^
I'm wondering what am I missing. -
well basically it says you are doing
void = QString
so check that findimage returns Qstring and that
imagePath is also declared Qstring -
well basically it says you are doing
void = QString
so check that findimage returns Qstring and that
imagePath is also declared Qstring -
Does ur compiler support lambdas?
Try with empty { }connect(Image_Button, &QPushButton::clicked, [this]() { })
you need Qt 5.5 and newer compiler.
-
Does ur compiler support lambdas?
Try with empty { }connect(Image_Button, &QPushButton::clicked, [this]() { })
you need Qt 5.5 and newer compiler.
-
@gabor53
well it can then compile the line.
what compiler is it ?
VS or mingw?
and what version?