在我的项目中,我有40个QPushButton
全部放入QButtonGroup
这样:
QButtonGroup* group = new QButtonGroup(this);
group->addButton(ui->slot_0);
group->addButton(ui->slot_1);
//...
group->addButton(ui->slot_38);
group->addButton(ui->slot_39);
每个按钮都是QPushButton
我可以检查的。这样,一次只能检查一个按钮。一切都很好,但是当其中一个按钮被检查时,如何“制作插槽”?我不希望有40个不同的插槽,每个按钮一个最终完成基本相同的操作。有什么方法可以使用QButtonGroup
我把它们放进去吗?
答案 0 :(得分:3)
QButtonGroup
的文档显示QButtonGroup::buttonClicked()
信号 - 您是否已尝试过该信号?
信号有两种变体 - 一种是QPushButton
作为参数(作为QAbstractButton
),另一种是给出组中按钮的ID。
您可以使用connect()
在C ++代码中设置信号和插槽连接。
在窗口类的初始化期间(可能在构造函数中),请调用:
connect(myButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(theSlotThatYouWrite(QAbstractButton*));
myButtonGroup
可能是this->ui->nameOfTheButtonGroup
,而theSlotThatYouWrite
是您在自己的代码中编写的函数,属于窗口的类,返回void并发出信号{{ 1}}作为参数(因为这是特定信号作为参数提供的内容)。
确保QAbstractButton*
位于班级界面中的“私人广告位:”或“公共广告位:”标签下。
以下是我自己代码中某些信号和插槽的实际使用情况的屏幕截图。
信号和老虎机是非常重要的学习内容,但在第一次尝试理解它时,它可能会有点爬山!
答案 1 :(得分:2)
正如Jamin和Nikos所说:你应该创建自己的插槽来处理QButtonGroup发出的信号。它可能是这样的:
在头文件中:
public slots:
void buttonWasClicked(int);
在* .cpp文件中:
void MainWindow::buttonWasClicked(int buttonID)
{
cout << "You have clicked button: " << buttonID << endl;
}
在负责创建MainWindow的代码中(即在构造函数中但不是必需的)应该有这一行:
connect(group, SIGNAL(buttonClicked(int)), this, SLOT(buttonWasClicked(int)));
请注意,自Qt5起,连接语法已更改。我在这里使用的语法来自Qt4。它仍然有效但现已弃用(有关更多信息,请参阅New Signal Slot Syntax in Qt 5)。此外,我建议通过QButtonGroup类引用,因为有其他可用信号可以比我选择的更好地满足您的需求。
BR