【问题标题】:How to tell when a QPushButton is clicked in a QButtonGroup如何判断在 QButtonGroup 中单击 QPushButton 的时间
【发布时间】:2013-07-15 03:41:13
【问题描述】:

在我的项目中,我将 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

【问题讨论】:

    标签: c++ qt signals-slots qpushbutton


    【解决方案1】:

    正如 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

    【讨论】:

      【解决方案2】:

      QButtonGroup 的文档显示了 QButtonGroup::buttonClicked() 信号 - 你已经尝试过那个信号了吗?

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

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

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

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

      其中myButtonGroup 可能是this-&gt;ui-&gt;nameOfTheButtonGroup,而theSlotThatYouWrite 是您在自己的代码中编写的属于您的窗口类的函数,它返回void 并将信号QAbstractButton* 作为参数(因为这就是这个特定信号作为参数给出的)。

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

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

      信号和插槽是非常重要的学习内容,但在第一次尝试理解它时可能有点难以攀登!

      【讨论】:

      • 您能详细说明一下吗?我真的不明白。我会把函数写成什么? void MainWindow::QButtonGroup::buttonClicked();
      • @mc360pro 这是一个信号。您将它连接到一个插槽,该插槽采用提供的参数类型之一。传递的参数将是单击的按钮。如果你不知道如何连接信号和插槽,这里有一个教程:qt-project.org/doc/qt-5.1/qtcore/signalsandslots.html
      • 让我们这么说吧,我很遗憾到目前为止,我一直在做的任何信号/插槽使用都是当我右键单击一个按钮并选择“转到插槽”时。从那时起,我只需将我的命令添加到在 mainwindow.cpp 中创建的函数中。所以我不知道如何在不点击“转到插槽”的情况下设置我的“自己的功能”。我现在要做的就是单击其中一个按钮,然后让 qDebug 告诉我单击了哪个按钮。如果我能做到,我就准备好了。
      • 'Go to slot' 并不总是显示所有可用的插槽,并且不能用于所有内容(想象动态创建小部件 - 您将如何连接小部件的插槽还不存在?)。您需要使用 'connect()' 来连接信号和插槽 - 我稍微更新了我的答案,以了解用法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2018-03-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多