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

Popular posts from this blog

searchKeyword not working in AngularJS filter -

sequelize.js - Sequelize: sort by enum cases -

user interface - how to replace an ongoing process of image capture from another process call over the same ImageLabel in python's GUI TKinter -