在QTableWidget表格中显示一个QCheckBox:
第一种方法,QTableWidgetItem这个对象有CheckState属性,既能显示QCheckBox,又能读取状态。
QTableWidget *tableWidget = new QTableWidget;
QTableWidgetItem *checkBox = new QTableWidgetItem();
checkBox->setCheckState(Qt::Checked);
tableWidget ->setItem(2, 2, checkBox);
以上代码就在tablewidget中显示一个QCheckBox。但是如何判断复选框是否被选中呢,方法是利用QTableWidget::cellChanged()函数,检查单元格内容的变化,然后连接此信号,在槽函数中检测checkBox的状态。
connect(tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(changeTest(int, int)));
void changeTest(int row, int col)
{
if(tableWidget ->item(row, col)->checkState() == Qt::Checked) //选中
…
else
…
}
不过这样的QCheckBox是左对齐的。如果想要让居中对齐就还是需要使用第二种方法。而且可以设置我们想要的checkbox的样式
第二种方法:void QTableWidget::setCellWidget(int row, int column, QWidget *widget),事实证明使用这个函数正常显示CheckBox没有问题
可以借助 void setObjectName(const QString &name),通过 objectName,去设置和获取行列号
详细代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <QCheckBox> #include <QTableWidget> #include <QHBoxLayout> #include <QDebug> #include <QStyleFactory> //获取CheckBox QCheckBox* getCheckBox(QTableWidget*table,int row ,int column) { QWidget* pWidget = 0; pWidget = table->cellWidget(row,column); //找到单元格 QCheckBox *pCheckBox = 0; bool bNew = true; if(pWidget != 0) // { bNew = false; } if(bNew) { pWidget = new QWidget(table); //创建一个widget QHBoxLayout *hLayout = new QHBoxLayout(pWidget); //创建布局 pCheckBox = new QCheckBox(pWidget); //根据objectName ,去拆解所属的tableWidget 、行、列 pCheckBox->setObjectName(QString("%1_%2_%3_Itme").arg(table->objectName()).arg(row).arg(column)); pCheckBox->setChecked(false); pCheckBox->setFont(table->font()); pCheckBox->setFocusPolicy(Qt::NoFocus); pCheckBox->setStyle(QStyleFactory::create("fusion")); pCheckBox->setStyleSheet(QString(".QCheckBox {margin:3px;border:0px;}QCheckBox::indicator {width: %1px; height: %1px; }").arg(20)); hLayout->addWidget(pCheckBox); //添加 hLayout->setMargin(0); //设置边缘距离 hLayout->setAlignment(pCheckBox, Qt::AlignCenter); //居中 hLayout->setSpacing(0); pWidget->setLayout(hLayout); //设置widget的布局 table->setCellWidget(row,column,pWidget); } QList<QCheckBox *> allCheckBoxs = pWidget->findChildren<QCheckBox *>(); if(allCheckBoxs.size() > 0) pCheckBox = allCheckBoxs.first(); return pCheckBox; } //处理CheckBox QCheckBox* setCheckBox(QTableWidget*table,int row ,int column,bool checkd) { QCheckBox *check = getCheckBox(table,row,column); if(check != 0) // { check->setChecked(checkd); } QCheckBox::connect(check,&QCheckBox::stateChanged,[=]{ QString objectName = check->objectName(); QStringList nameList = objectName.split("_");//拆解 if(nameList.count() == 4) { QString tableName = nameList.at(0);//表格名称 int row = nameList.at(1).toInt();//行 int column = nameList.at(2).toInt();//列 bool checked = check->isChecked();//是否被选中 //知道了表格、行、列,就可以执行我们所需要的操作了。。。 qDebug() << QString("%1表第%2行第%3列是否被选中:%4") .arg(tableName).arg(row).arg(column).arg(checked?"是":"否"); } }); return check; } |
具体使用,写了例子,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableWidget->setRowCount(4); ui->tableWidget->setColumnCount(4); for(int i =0; i <2; i++) for(int j =0; j <4; j++) setCheckBox(ui->tableWidget,i,j,false); for(int i =2; i <4; i++) { for(int j =0; j <4; j++) { QTableWidgetItem*item = new QTableWidgetItem(); item->setTextAlignment(Qt::AlignCenter); item->setFont( ui->tableWidget->font()); item->setCheckState(Qt::Checked); ui->tableWidget->setItem(i, j, item); } } |
执行效果如下图:前两行是QCheckBox,后两行是 QTableWidgetItem这个对象有CheckState属性
