关键词:QTableWidget(控件),复选框,点击表头排序
为了在Qt中实现在表中插入复选框、以及点击表头实现排序功能(要求有的列按数值排序、有的列按字典序排序),耗费了我好几天时间,还是比较痛苦的几天,在网上查了相关资料,将其总结如下。
创建一个对话框,向对话框添加QTableWidget控件,并栅格布局(“Lay out in a Grid”)。在对话框的构造函数中插入代码(此处仅仅是为了易于实现,这些代码当然也可写在别的函数中),整个类的实现代码如下:
#include "mydialog.h"
#include "ui_mydialog.h"
#include <QTableWidgetItem>
MyDialog::MyDialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::MyDialog)
{
ui->setupUi(this);
int nRowCount = 100; // 行数
int nColCount = 10; // 列数
ui->tableWidget->setRowCount(nRowCount); // 设置行数
ui->tableWidget->setColumnCount(nColCount); // 设置列数
QTableWidgetItem * newItem = nullptr;
int nCheckBoxCol = 0; // 复选框所在的列号(从0开始)
// 填写表格内容
for(int i=0; i<nRowCount; i++){
for(int j=0; j<nColCount; j++){
newItem = new QTableWidgetItem();
if(j==nCheckBoxCol){
newItem->setData(Qt::DisplayRole, i+1); // 数字排序
newItem->setCheckState(Qt::Checked); // 设置复选框
}else{
newItem->setText(tr("%1").arg(i*nColCount+j+1)); // 字符排序
}
ui->tableWidget->setItem(i,j,newItem);
}
}
// 设置表格单元内容不可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
// 使能排序
ui->tableWidget->setSortingEnabled(true);
// 表头设置最后一列数据填充整个控件
//ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
// 表头内容均分填充整个控件
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
MyDialog::~MyDialog()
{
delete ui;
}
运行效果如下图所示。
图中第一列是复选框所在列,点击表头时按照数值大小排序;其他列点击表头时按字典序排列。