Я пытаюсь добавить проверенные gropuboxes, и если один групповой пакет проверен, другой должен быть снят.Альтернативная проверка проверяемых QGroupboxes
Так я думал, я добавляю
connect(m_grp1, SIGNAL(toggled(bool)), this, SLOT(grp1Changed(bool)));
connect(m_grp2, SIGNAL(toggled(bool)), this, SLOT(grp2Changed(bool)));
Но если изменить проверку на grp2 при изменении grp1, что вызовет изменение 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();
}
Просто проверьте значение параметра в слоте? – peppe
@peppe Это то, что я закончил делать, как вы, вероятно, видели в ответе, который я опубликовал (я просто не могу принять за 2 дня) – Thalia