如何判断在QButtonGroup中单击QPushButton的时间

时间:2013-07-15 03:41:13

标签: c++ qt signals-slots qpushbutton

在我的项目中,我有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我把它们放进去吗?

2 个答案:

答案 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*位于班级界面中的“私人广告位:”或“公共广告位:”标签下。

以下是我自己代码中某些信号和插槽的实际使用情况的屏幕截图。

Click to see full size

信号和老虎机是非常重要的学习内容,但在第一次尝试理解它时,它可能会有点爬山!

答案 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