qt - Alternately checking checkable QGroupboxes -
i trying add checked gropuboxes, , if 1 groupbox checked other should unchecked.
so thought, add
connect(m_grp1, signal(toggled(bool)), this, slot(grp1changed(bool))); connect(m_grp2, signal(toggled(bool)), this, slot(grp2changed(bool))); but if change check on grp2 when grp1 changes, trigger change in grp2, trigger change in grp1...
is there built-in can use - radio buttons ? or can't use checked group boxes , must implement behavior radio buttons myself ?
my code (qt 4.8):
should add in grid layout 2 checked group boxes, each items inside in grid layout, both boxes checkable , 1 of them checked.
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); // trigger grp2changed , lead infinite loop } void groupboxes::grp2changed(bool _on) { m_grp1->setchecked(!_on); // trigger grp1changed , lead 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(); }
you need uncheck checkbox , need use signalblocker not getting in infinite loop
void groupboxes::grp1changed(bool _on){ qsignalblocker(m_grp2); qsignalblocker(m_grp1); m_grp2->setchecked(!_on); m_grp1->setchecked(_on); } but should use radiobuttons in same layout since it's not possible check more 1 radiobutton.
Comments
Post a Comment