Qt自定义QPushButton点击信号

Qt custom QPushButton clicked signal

我想将两个整数(string 和 fret)发送到一个 SLOT,该 SLOT 将处理按下的按钮的位置。 SIGNAL 和 SLOT 参数必须匹配,所以我想我需要重新实现 QPushButton::clicked 事件方法。问题是我是 Qt 的新手,可以使用一些指导。

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

如果您使用 C++11 connection syntax,您可以使用 lambda 调用 testSlot 以及您的 stringfret 参数:

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

此代码使用 [captures, ...](arguments, ...) { code } 语法创建一个 lambda。当您建立连接时,它会捕获 stringfret 变量值,然后在单击按钮时将它们传递给 testSlot

您可以使用两种方法来添加弦乐和音品信息。一种是使用 sender() 函数获取发出信号的按钮。如果它们是您的按钮的成员,您可以访问品格和字符串 class 所以在 SLOT 中您将拥有。

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

但是,由于您已经对 QPushButton 进行了子类化,因此您可以使用私有 SLOT 来捕获 buttonClicked 信号和 re-emit 具有正确值的信号。

在构造函数中

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

然后重发SLOT

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

一定要添加适当的专用插槽并public向您发出信号class https://doc.qt.io/archives/qq/qq10-signalmapper.html 请参阅这篇文章,了解有关向信号添加参数的各种方法的良好讨论。