2015-07-13 4 views
0

Я пытаюсь добавить проверенные 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(); 
} 
+0

Просто проверьте значение параметра в слоте? – peppe

+0

@peppe Это то, что я закончил делать, как вы, вероятно, видели в ответе, который я опубликовал (я просто не могу принять за 2 дня) – Thalia

ответ

2

Вам нужно, чтобы снять свой флажок, и вы должны использовать SignalBlocker для не получать в бесконечном цикле

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

но вы должны использовать RadioButtons в том же макете, так как это не представляется возможным проверить более 1 RadioButton.

+0

Спасибо, это интересно, но было представлено в Qt 5.3 - как я уже говорил Я должен использовать 4.8, поэтому я не могу даже проверить, работает ли он. Я поднимусь, потому что что-то узнал. – Thalia

+0

Причина, по которой я не использовал кнопки «Радио», - это то, что я хотел использовать встроенные флажки, как я упомянул в своем вопросе. – Thalia

+0

Sry Я не читал это ... но вы можете использовать blockSignal, см. Doc http://doc.qt.io/qt-4.8/qobject.html, или вы можете создать свой собственный класс http://stackoverflow.com/ Вопросы/3556687/prevent-firing-signals-in-qt –

0

Я сделаю

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

Таким образом, я, кажется, чтобы избежать бесконечного цикла, потому что я меняю только правда, и установить изменения в ложь.

0

Вы можете добавить виджеты QCheckBox в QButtonGroup. QButtonGroup заботится о том, чтобы установить только один из его членов. Или используйте свойство autoExclusive.

Или используйте QRadioButton, если это то, что вы на самом деле предназначили. Вы должны использовать флажки для этой цели, только если вы хотите отменить выбор обоих.

+0

Флажки не ведут себя иначе в группе кнопок - и я не вижу свойство autoExclusive для QGroupBox. Я не хочу отбирать обе коробки ... Я бы предпочел НЕ использовать переключатели OR флажков отдельно, так как QGroupBox уже имеет свойство checked. Добавление большего количества элементов пользовательского интерфейса делает UI громоздким и уродливым, поэтому, если есть что-то ПОСТРОЕНИЕ, я хочу его использовать. – Thalia

+0

Флажки действительно ведут себя, как я описываю - попробуйте. Но я не понимал, что вы говорите об эксклюзивных виджетах QGroupBox, а не только о виджетах QCheckBox. Может быть, это не хороший дизайн пользовательского интерфейса, поэтому он не встроен? В любом случае, используйте блокиратор сигналов ... –

Смежные вопросы