或者检查可检查的QGroupboxes

时间:2015-07-13 16:06:28

标签: qt checked groupbox

我正在尝试添加已检查的gropuboxes,如果选中了一个groupbox,则应取消选中另一个。

所以我想,我添加了

    connect(m_grp1, SIGNAL(toggled(bool)), this, SLOT(grp1Changed(bool)));
    connect(m_grp2, SIGNAL(toggled(bool)), this, SLOT(grp2Changed(bool)));

但是如果我在grp1改变时更改grp2的检查,那将触发grp2的更改,这将触发grp1的更改......

我可以使用内置的任何东西 - 比如单选按钮吗?或者我不能使用选中的组框,并且必须自己用单选按钮实现行为?

我的代码(Qt 4.8):
应该在网格布局中添加2个选中的组框,每个框都在网格布局中包含一些项目,两个框都可以检查,其中一个选中。

groupboxes.h

#ifndef GROUPBOXES_H
#define GROUPBOXES_H

#include <QtGui>

class GroupBoxes : public QWidget
{
    Q_OBJECT

public:
    GroupBoxes(QWidget *parent = 0);

private slots:
    void grp1Changed(bool _on);
    void grp2Changed(bool _on);

private:
    QGroupBox *m_grp2;
    QGroupBox *m_grp1;

    void setGroup1();
    void setGroup2();
};

#endif // GROUPBOXES_H


groupboxes.cpp

#include "groupboxes.h"

GroupBoxes::GroupBoxes(QWidget *parent)
    : QWidget(parent)
{
    setGroup1();
    setGroup2();

    connect(m_grp1, SIGNAL(toggled(bool)), this, SLOT(grp1Changed(bool)));
    connect(m_grp2, SIGNAL(toggled(bool)), this, SLOT(grp2Changed(bool)));
    QGridLayout *grid = new QGridLayout;

    grid->addWidget(m_grp1, 0, 0);
    grid->addWidget(m_grp2, 1, 0);
    setLayout(grid);

    setWindowTitle(tr("Group Boxes"));
    resize(480, 320);
}

void GroupBoxes::setGroup1()
{
    QLabel lbl1 = new QLabel(tr("def"));
    m_grp1 = new QGroupBox("DEF");
    m_grp1->setCheckable(true);
    m_grp1->setChecked(true);
    QGridLayout *boxLayout1 = new QGridLayout;
    boxLayout1->addWidget(lbl1, 0, 0, 1, 1);
    m_grp1->setLayout(boxLayout1);
}

void GroupBoxes::setGroup2()
{
    QLabel lbl1 = new QLabel(tr("abc"));
    m_grp2 = new QGroupBox("ABC");
    m_grp2->setCheckable(true);
    m_grp2->setChecked(false);
    QGridLayout *boxLayout = new QGridLayout;
    boxLayout->addWidget(lbl1, 0, 0, 1, 1);   
    m_grp2->setLayout(boxLayout);
}

void GroupBoxes::grp1Changed(bool _on)
{
    m_grp2->setChecked(!_on);  // but that would trigger grp2Changed and will lead to infinite loop
}
void GroupBoxes::grp2Changed(bool _on)
{
    m_grp1->setChecked(!_on);  // but that would trigger grp1Changed and will lead to infinite loop
}


main.cpp

#include <QApplication>
#include "groupboxes.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GroupBoxes window;
    window.show();
    return a.exec();
}

3 个答案:

答案 0 :(得分:2)

您需要取消选中您的复选框,并且需要使用SignalBlocker才能无限循环

void GroupBoxes::grp1Changed(bool _on){
QSignalBlocker(m_grp2);
QSignalBlocker(m_grp1);
m_grp2->setChecked(!_on);
m_grp1->setChecked(_on);
}

但是您应该在同一个布局中使用RadioButtons,因为它无法检查超过1 RadioButton

答案 1 :(得分:0)

我会做

void GroupBoxes::grp1Changed(bool _on)
{
    if(_on)
        m_grp2->setChecked(false);  
}

这样我似乎避免了无限循环,因为我只改变了true,并将更改设置为false。

答案 2 :(得分:0)

您可以将QCheckBox小部件添加到QButtonGroup。 QButtonGroup负责确保只设置其中一个成员。或者使用autoExclusive属性。

或者使用QRadioButton,如果这是你真正想要的。如果您希望能够取消选择两者,则只应使用复选框。