3

在我的项目中,我有 40 QPushButtons 全部放入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我放入的吗?

4

2 回答 2

3

的文档QButtonGroup显示了一个QButtonGroup::buttonClicked()信号-您是否已经尝试过那个信号?

该信号有两种变体 - 一种提供QPushButton作为参数(作为 a QAbstractButton),另一种提供组中按钮的 ID。

您可以使用connect()在 C++ 代码中设置信号和插槽连接。

在初始化窗口类的某个时候(可能在构造函数中),调用它:

connect(myButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(theSlotThatYouWrite(QAbstractButton*));

Where myButtonGroupis likely this->ui->nameOfTheButtonGroup, andtheSlotThatYouWrite是您在自己的代码中编写的一个函数,属于您的窗口类,它返回 void 并将信号QAbstractButton*作为参数(因为这是这个特定信号作为参数给出的)。

确保theSlotThatYouWrite在班级界面中的标签“私人插槽:”或“公共插槽:”下。

这是我自己的代码中一些信号和插槽的实际使用截图。

点击查看完整尺寸

Signals and Slots 是非常重要的学习内容,但在第一次尝试理解它时可能有点难爬!

于 2013-07-15T04:00:29.883 回答
3

正如 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。它仍然有效,但现在已弃用(有关更多信息,请参阅Qt 5 中的新信号槽语法)。此外,我建议通过 QButtonGroup 类参考,因为还有其他可用信号可以比我选择的信号更好地满足您的需求。

BR

于 2013-07-15T07:54:57.430 回答