How to add one parameter to the clicked SIGNAL?
-
wrote on 1 Oct 2017, 05:11 last edited by
Hi, Good Nigth!
I'm newie in QT and I need to create a GUI with an array of buttons, for example 8 buttons which represents the bits of a byte. When the buttons are created they are initialized with the text "0" and I need to change the text of the n-th button to "1" when is clicked. I think that the problem is the signal, I need to add one parameter to the SIGNAL(clicke()) but I haven't understand how I can do this, this is my code, thanks for your time! Any help would be appreciated:In my header I have the following code:
class QPushButton;
class Window : public QWidget
{
Q_OBJECT
public:
explicit Window(QWidget *parent = nullptr);private:
QPushButton *m_button[54];
int i, j = 50;signals:
public slots:
void slotButtonClicked(bool checked, int i);
};#endif // WINDOW_H
and in the cpp file I have this:
Window::Window(QWidget *parent) : QWidget(parent)
{
/Some variables//*Set size of the window*/ setFixedSize(1300,400); /*Create and position of the buttons*/ for(i = 0; i<54; i++){ m_button[i] = new QPushButton("0",this); m_button[i]->setGeometry(100+(20*i),j,20,20); m_button[i]->setCheckable(true); /*Do the connection*/ connect(m_button[i], SIGNAL(clicked(bool)), this, SLOT(slotButtonClicked(bool, int i))); }
}
void Window::slotButtonClicked(bool checked, int idx){
if(checked){
m_button[idx]->setText("1");
}else{
m_button[idx]->setText("0");
}
} -
Hi, Good Nigth!
I'm newie in QT and I need to create a GUI with an array of buttons, for example 8 buttons which represents the bits of a byte. When the buttons are created they are initialized with the text "0" and I need to change the text of the n-th button to "1" when is clicked. I think that the problem is the signal, I need to add one parameter to the SIGNAL(clicke()) but I haven't understand how I can do this, this is my code, thanks for your time! Any help would be appreciated:In my header I have the following code:
class QPushButton;
class Window : public QWidget
{
Q_OBJECT
public:
explicit Window(QWidget *parent = nullptr);private:
QPushButton *m_button[54];
int i, j = 50;signals:
public slots:
void slotButtonClicked(bool checked, int i);
};#endif // WINDOW_H
and in the cpp file I have this:
Window::Window(QWidget *parent) : QWidget(parent)
{
/Some variables//*Set size of the window*/ setFixedSize(1300,400); /*Create and position of the buttons*/ for(i = 0; i<54; i++){ m_button[i] = new QPushButton("0",this); m_button[i]->setGeometry(100+(20*i),j,20,20); m_button[i]->setCheckable(true); /*Do the connection*/ connect(m_button[i], SIGNAL(clicked(bool)), this, SLOT(slotButtonClicked(bool, int i))); }
}
void Window::slotButtonClicked(bool checked, int idx){
if(checked){
m_button[idx]->setText("1");
}else{
m_button[idx]->setText("0");
}
}wrote on 1 Oct 2017, 05:38 last edited by ambershark 10 Jan 2017, 05:44@ChristianMontero You can't change the definition like that. So you won't be able to just add a variable, but what you can do is inside your clicked handler you can check the state of the button.
Another option is to derive a class from QPushButton and emit a separate signal with the
bool, int
that you want. Inside the new class you would get the clicked signal and then emit aclicked(bool, int)
which you could then capture at the Window level as normal.Edit: I realized you may need a bit of code to reference, here's how you can check the state of a button in a normal
clicked()
function:void Window::clicked() { auto button = qobject_cast<QPushButton *>(sender()); Q_ASSERT(button); if (button->text() == "0") button->setText("1") else button->setText("0"); }
-
@ChristianMontero You can't change the definition like that. So you won't be able to just add a variable, but what you can do is inside your clicked handler you can check the state of the button.
Another option is to derive a class from QPushButton and emit a separate signal with the
bool, int
that you want. Inside the new class you would get the clicked signal and then emit aclicked(bool, int)
which you could then capture at the Window level as normal.Edit: I realized you may need a bit of code to reference, here's how you can check the state of a button in a normal
clicked()
function:void Window::clicked() { auto button = qobject_cast<QPushButton *>(sender()); Q_ASSERT(button); if (button->text() == "0") button->setText("1") else button->setText("0"); }
wrote on 1 Oct 2017, 05:43 last edited by@ambershark Thank you for your time, just another thing please
how can I check the state of the particular button of the array if I can't send the number of the element as a parameter?
again, thanks a lot! -
@ambershark Thank you for your time, just another thing please
how can I check the state of the particular button of the array if I can't send the number of the element as a parameter?
again, thanks a lot!wrote on 1 Oct 2017, 05:44 last edited by@ChristianMontero Hey sorry, was in the middle of editing my previous post, check above for a code example. :)
-
@ChristianMontero Hey sorry, was in the middle of editing my previous post, check above for a code example. :)
wrote on 1 Oct 2017, 05:50 last edited by@ambershark Thanks a lot, let me try it!
-
@ChristianMontero Hey sorry, was in the middle of editing my previous post, check above for a code example. :)
wrote on 1 Oct 2017, 06:09 last edited by@ambershark Thanks a lot! it works!
have a great day/nigth I don't know where are you writing me!
you are so helpful! -
@ambershark Thanks a lot! it works!
have a great day/nigth I don't know where are you writing me!
you are so helpful!wrote on 1 Oct 2017, 06:10 last edited by@ChristianMontero Night for me, and you're welcome, happy to help. :)
-
@ChristianMontero Night for me, and you're welcome, happy to help. :)
wrote on 1 Oct 2017, 06:21 last edited by@ambershark hey one last thing :/ where could I read to understand the second option that you gave me, I mean to emit a different Clicked signal, because for the purpose of the application the next step it's to pass the text of each button to a string and I have to acces to every button as an element of an array, I hope not to bother you anymore, just need some reference, you think that the QT Documentation can help me on this, or would you recommend me somewhere else to read?
-
@ambershark hey one last thing :/ where could I read to understand the second option that you gave me, I mean to emit a different Clicked signal, because for the purpose of the application the next step it's to pass the text of each button to a string and I have to acces to every button as an element of an array, I hope not to bother you anymore, just need some reference, you think that the QT Documentation can help me on this, or would you recommend me somewhere else to read?
wrote on 1 Oct 2017, 06:25 last edited by@ChristianMontero It's no bother ... give me a sec and I'll type up an example for you. I'm not sure of a good place to point you for docs on it though.
It's basically just deriving a class and setting your own signals.
-
@ChristianMontero It's no bother ... give me a sec and I'll type up an example for you. I'm not sure of a good place to point you for docs on it though.
It's basically just deriving a class and setting your own signals.
wrote on 1 Oct 2017, 06:33 last edited by ambershark 10 Jan 2017, 06:34Here ya go... there may be errors I didn't compile or anything.
MyButton.h file:
#pragma once #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QWidget *parent = 0) : QWidget(parent), someBool_(false), someInt_(0) { connect(this, SIGNAL(clicked()), this, SLOT(handleClick())); } signals: void buttonClicked(bool, int); private slots: void handleClick() { emit buttonClicked(someBool_, someInt_); } private: bool someBool_; int someInt_; };
Some window.cpp somewhere:
// somewhere else ... i.e. Window // ... { connect(instanceOfMyButton, SIGNAL(buttonClicked(bool, int)), this, SLOT(myHandler(b } void Window::myHandler(bool b, int i) { // do whatever you want with b/i }
-
@ambershark hey one last thing :/ where could I read to understand the second option that you gave me, I mean to emit a different Clicked signal, because for the purpose of the application the next step it's to pass the text of each button to a string and I have to acces to every button as an element of an array, I hope not to bother you anymore, just need some reference, you think that the QT Documentation can help me on this, or would you recommend me somewhere else to read?
wrote on 1 Oct 2017, 06:43 last edited by@ChristianMontero said in How to add one parameter to the clicked SIGNAL?:
@ambershark hey one last thing :/ where could I read to understand the second option that you gave me, I mean to emit a different Clicked signal, because for the purpose of the application the next step it's to pass the text of each button to a string and I have to acces to every button as an element of an array, I hope not to bother you anymore, just need some reference, you think that the QT Documentation can help me on this, or would you recommend me somewhere else to read?
If you explain this a bit more I can help you design it better perhaps.. I don't quite understand what you're trying to do. I wrote the example above to show you what I was talking about making a custom derived button, but it may not be a good solution for what you want. Or at least there may be a more elegant or easier one.
-
Here ya go... there may be errors I didn't compile or anything.
MyButton.h file:
#pragma once #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QWidget *parent = 0) : QWidget(parent), someBool_(false), someInt_(0) { connect(this, SIGNAL(clicked()), this, SLOT(handleClick())); } signals: void buttonClicked(bool, int); private slots: void handleClick() { emit buttonClicked(someBool_, someInt_); } private: bool someBool_; int someInt_; };
Some window.cpp somewhere:
// somewhere else ... i.e. Window // ... { connect(instanceOfMyButton, SIGNAL(buttonClicked(bool, int)), this, SLOT(myHandler(b } void Window::myHandler(bool b, int i) { // do whatever you want with b/i }
wrote on 1 Oct 2017, 06:53 last edited by ChristianMontero 10 Jan 2017, 06:55@ambershark Thank you very much, I just stared to use QT and I was having problems, but I hope i get use to it quickly and start helping people just like you, thanks you again! take care!
I just read your last comment, well I have to establish a connection between 2 devices, via UDP could be two computers, cellphones or microcontrollers, then in my GUI I need two sections, the first one is an array of labels, where i will show the data that i will recieve from de UDP connection, and the second section is an array of buttons, where the user will click to change the value of the bits, and then I'll have to pass the value of the buttons to the string which I will send via UDP as response to the information I recieved. And I have to use labels and buttons because they're requirements of the client.
I hope to be specific enough.
And thanks again.
-
I think QSignalMapper [1] was written for exactly this problem :)
-
I think QSignalMapper [1] was written for exactly this problem :)
wrote on 1 Oct 2017, 07:07 last edited by@aha_1980 That sure does do what he needs, lol. I didn't know about QSignalMapper.. It's funny that even after 16+ years of Qt there's still classes I don't know about. :)
-
I think QSignalMapper [1] was written for exactly this problem :)
wrote on 1 Oct 2017, 07:10 last edited by@aha_1980 Thanks you so much, I'll check the link!
-
@aha_1980 That sure does do what he needs, lol. I didn't know about QSignalMapper.. It's funny that even after 16+ years of Qt there's still classes I don't know about. :)
wrote on 1 Oct 2017, 07:10 last edited by@ambershark Thank you, you're so helpful :)
-
@ambershark said in How to add one parameter to the clicked SIGNAL?:
@aha_1980 That sure does do what he needs, lol. I didn't know about QSignalMapper.. It's funny that even after 16+ years of Qt there's still classes I don't know about. :)
I only knew it because I had the same requirement as @ChristianMontero some time ago :)
-
wrote on 9 Jun 2023, 20:54 last edited by
Hello @ChristianMontero hope you ok,
Just implement a QPushButton::clicked() slot that is connected to multiple push buttons. Inside that cast sender() to QPushButton* to access the button and identify it. You can then emit a user defined signal with additional parameters.
Another method would be using a C++11 lambda:
int counter = 1; // Create button or access it using the ui member QPushButton *button = new QPushButton; //In your case is m_button button->setProperty("myId", counter++); // in your case counter++ should be m_button[i] connect(button, &QPushButton::clicked, [this, button](){ //here you call your function pasing parameters slotButtonClicked(true, button->property("myId").toInt()); });
I took this from here https://www.codeproject.com/Questions/1257831/Qt-custom-slot-sending-an-integer
-
Hello @ChristianMontero hope you ok,
Just implement a QPushButton::clicked() slot that is connected to multiple push buttons. Inside that cast sender() to QPushButton* to access the button and identify it. You can then emit a user defined signal with additional parameters.
Another method would be using a C++11 lambda:
int counter = 1; // Create button or access it using the ui member QPushButton *button = new QPushButton; //In your case is m_button button->setProperty("myId", counter++); // in your case counter++ should be m_button[i] connect(button, &QPushButton::clicked, [this, button](){ //here you call your function pasing parameters slotButtonClicked(true, button->property("myId").toInt()); });
I took this from here https://www.codeproject.com/Questions/1257831/Qt-custom-slot-sending-an-integer