我正在尝试添加已检查的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();
}
答案 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,如果这是你真正想要的。如果您希望能够取消选择两者,则只应使用复选框。