1
votes

I want to send two integers, string and fret, to a SLOT that will process the location of the button that was pressed. The SIGNAL and SLOT argument have to match so I am thinking I need to reimplement the QPushButton::clicked event method. Problem is I am new to Qt and could use some direction.

connect(&fretBoardButton[string][fret], SIGNAL(clicked()), this, SLOT     (testSlot()));
2

2 Answers

5
votes

If you use the C++11 connection syntax you can use a lambda with calls testSlot with your string and fret arguments:

connect(&fretBoard[string][fret], &QPushButton::clicked, [this, string, fret]() {
    testSlot(string, fret);
});

This code creates a lambda using the [captures, ...](arguments, ...) { code } syntax. When you make the connection it captures the string and fret variable values, and will then pass them on to testSlot when the button is clicked.

0
votes

There are Two approaches you could use to add the string and fret information. one is to use the sender() function to get the button which emitted the signal. you can the access fret and string if they are members of your button class so in the SLOT you would have.

MyPushButton *button = (MyPushButton *)sender();
button.getFret();
button.getString(); 

However since you are already subClassing QPushButton you could use a private SLOT to catch the buttonClicked signal and re-emit a signal with the right values.

In the constructor

connect(this, SIGNAL(clicked()), this, SLOT(reemitClicked()));

and then the reemit SLOT

void MyPushButton::reemitClicked()
{
    emit clicked(m_fret, m_string);
}

be sure to add the appropriate private slot and public signal to you class https://doc.qt.io/archives/qq/qq10-signalmapper.html see this artical for a good discussion on various ways to add an argument to signal.