QRadioButton分组且无边框的简单实现
最近在用QT+VS2008做一个项目,涉及到一个综合测评表,说白了有点像问卷调查——很多题目每题若干个选项。
初始时打算用下拉框,每个框中填入所有选项,但后来一琢磨这种方式不够直观与人性化,增添了一步用户下拉的操作。
于是决定换用单选按钮,在QT中叫做QRadioButton。啪啦啪啦一阵折腾,界面上前一半是题目,后一半全是一行一行的小圆孔,直接上图:
兴奋地马上编译、运行,一点瞬间懵了,整个界面上只有一个按钮同时有效。
当然,头脑冷静下来后就知道原因了:没有对这些按钮进行分组处理。
分组,首先凭直觉想到的就是利用QGroupBox,前面忘了解释,其实QT中控件类的名称与使用方法和MFC类似,只是接触久了发现前者更容易通过纯代码实现GUI应用程序的开发。
立即对每行的四个小不点配备一个QGroupBox,由于是水平排布,又借用了QHBoxLayout控件,可以通过其方法设置子控件的间距等属性。
又是啪啦啪啦一阵,编译、运行,发现每行都存在一个组框,显然不够美观,上网查呗。
高手如云,招式一个接一个,试了几种改变QGroupBox的属性,均以失败告终。
最终采纳了一种朴素又高大上的土方法:利用QWidget替代QGroupBox,即能胜任工作又环保无边框。
简单地Find and Replace了一下,达到目的了。下面给出上面五组的完整实现代码,比较笨拙,各位朋友看了之后给点建议,希望能从代码量与复杂度上改进一番!
在“XXX.h”中声明所需变量,这里只给出单选按钮部分:
QRadioButton *jradio11; QRadioButton *jradio12; QRadioButton *jradio13; QRadioButton *jradio14; QRadioButton *jradio21; QRadioButton *jradio22; QRadioButton *jradio23; QRadioButton *jradio24; QRadioButton *jradio31; QRadioButton *jradio32; QRadioButton *jradio33; QRadioButton *jradio34; QRadioButton *jradio41; QRadioButton *jradio42; QRadioButton *jradio43; QRadioButton *jradio44; QRadioButton *jradio51; QRadioButton *jradio52; QRadioButton *jradio53; QRadioButton *jradio54; QWidget *jiaxiangG1; QWidget *jiaxiangG2; QWidget *jiaxiangG3; QWidget *jiaxiangG4; QWidget *jiaxiangG5; QHBoxLayout *jiaxiangH1; QHBoxLayout *jiaxiangH2; QHBoxLayout *jiaxiangH3; QHBoxLayout *jiaxiangH4; QHBoxLayout *jiaxiangH5;
在“XXX.cpp”中实现:
jradio11 = new QRadioButton(this); jradio12 = new QRadioButton(this); jradio13 = new QRadioButton(this); jradio14 = new QRadioButton(this); jradio21 = new QRadioButton(this); jradio22 = new QRadioButton(this); jradio23 = new QRadioButton(this); jradio24 = new QRadioButton(this); jradio31 = new QRadioButton(this); jradio32 = new QRadioButton(this); jradio33 = new QRadioButton(this); jradio34 = new QRadioButton(this); jradio41 = new QRadioButton(this); jradio42 = new QRadioButton(this); jradio43 = new QRadioButton(this); jradio44 = new QRadioButton(this); jradio51 = new QRadioButton(this); jradio52 = new QRadioButton(this); jradio53 = new QRadioButton(this); jradio54 = new QRadioButton(this); jiaxiangG1 = new QWidget(this); jiaxiangG2 = new QWidget(this); jiaxiangG3 = new QWidget(this); jiaxiangG4 = new QWidget(this); jiaxiangG5 = new QWidget(this); jiaxiangH1 = new QHBoxLayout(this); jiaxiangH2 = new QHBoxLayout(this); jiaxiangH3 = new QHBoxLayout(this); jiaxiangH4 = new QHBoxLayout(this); jiaxiangH5 = new QHBoxLayout(this); jiaxiangH1->addWidget(jradio11); jiaxiangH1->addWidget(jradio12); jiaxiangH1->addWidget(jradio13); jiaxiangH1->addWidget(jradio14); jiaxiangG1->setLayout(jiaxiangH1); jiaxiangG1->setGeometry(QRect(705,205,250,35)); jiaxiangH2->addWidget(jradio21); jiaxiangH2->addWidget(jradio22); jiaxiangH2->addWidget(jradio23); jiaxiangH2->addWidget(jradio24); jiaxiangG2->setLayout(jiaxiangH2); jiaxiangG2->setGeometry(QRect(705,280,250,35)); jiaxiangH3->addWidget(jradio31); jiaxiangH3->addWidget(jradio32); jiaxiangH3->addWidget(jradio33); jiaxiangH3->addWidget(jradio34); jiaxiangG3->setLayout(jiaxiangH3); jiaxiangG3->setGeometry(QRect(705,365,250,35)); jiaxiangH4->addWidget(jradio41); jiaxiangH4->addWidget(jradio42); jiaxiangH4->addWidget(jradio43); jiaxiangH4->addWidget(jradio44); jiaxiangG4->setLayout(jiaxiangH4); jiaxiangG4->setGeometry(QRect(705,445,250,35)); jiaxiangH5->addWidget(jradio51); jiaxiangH5->addWidget(jradio52); jiaxiangH5->addWidget(jradio53); jiaxiangH5->addWidget(jradio54); jiaxiangG5->setLayout(jiaxiangH5); jiaxiangG5->setGeometry(QRect(705,525,250,35));
不要让青春留下太多遗憾,专注