较小QT表格内嵌控件
前言:本思路仅适用于表格较小的情况,如果表格巨大,内存占用会剧增,建议另选思路。
一切都要从硬件提出的要求的开始,想要一个如下图的表格让他们测试功能。总之,有多个类似的元件,要对它们都能进行这两种独立的功能测试,在点击勾选框后,根据勾选框状态来判断元件应该设置为什么状态。
表格本身倒是挺好画的,拉个QTableWidget出来,设定好行数、列数和行头、列头就结束了,但是在checkbox这里犯了难,checkbox拉不进QTableWidget里面,倒是能在画面上显示,可是这样的勾选框和表格并非一体,后面要调整位置要分开调整,槽函数也要给每个勾选框单独写,这是我难以接受的。
AI给提供了通过代码批量向表格里内嵌控件的方法。
//有一个名字叫theTable的表格for(intcol=0;col<ui->theTable->columnCount();col++){for(introw=0;row<ui->theTable->rowCount();row++){QCheckBox*checkbox=newQCheckBox(ui->theTable);ui->theTable->setCellWidget(row,col,checkbox);}}以上代码就会在theTable每个单元格里嵌入一个checkbox,但是靠左侧对齐,看着很难受,AI说要先把checkbox放入容器,再把容器放入单元格能解决这个问题,这个我没有去验证。
在画好页面后,对于功能的实现上就简单很多了,定义一个槽函数,将checkbox的点击事件和槽函数绑定就行了,通过对checkbox定义两个属性,可以在点击事件中获得触发事件的checkbox对象,再获取控件的属性来得知被点击的是哪行哪列的勾选框,根据事前约定来判断应该对哪个元件进行什么配置,代码如下:
//有一个名字叫theTable的表格for(intcol=0;col<ui->theTable->columnCount();col++){for(introw=0;row<ui->theTable->rowCount();row++){QCheckBox*checkbox=newQCheckBox(ui->theTable);checkbox->setProperty("theRow",row);//为checkbox添加属性值为当前行号的属性"theRow"checkbox->setProperty("theCol",col);//为checkbox添加属性值为当前列好的属性"theRow"ui->theTable->setCellWidget(row,col,checkbox);//连接checkbox的点击事件信号和信号槽函数:UIName::onCheckBoxClickedconnect(checkbox,&QCheckBox::clicked,this,&UIName::onCheckBoxClicked);}}voidUIName::onCheckBoxClicked(boolchecked){//可选是否获得checkbox的点击后状态QCheckBox*sendbox=qobject_cast<QCheckBox*>(sender());introw=sendbox->property("theRow").toInt();intcol=sendbox->property("theCol").toInt();}这下checkbox的状态、行数、列数都有了,实现好功能函数,根据不同的行列号调不同的函数就行了。