QTableWidget使用
1. 设置表头
QStringList headerList;
headerList << QString("Control Mode")
<< QString("Technical Status")<< QString("Work Status")
<< QString("Starting Frequency") << QString("Ending Frequency")
<< QString("Starting Azimuth") << QString("Ending Azimuth")
<< QString("Elevation") << QString("Antenna Rotation Speed")
<< QString("Reporting Time");
m_workStatusTable->setColumnCount(headerList.size());
m_workStatusTable->setHorizontalHeaderLabels(headerList);
2. 设置列尺寸模式
通过下面的代码设置列宽模式。列尺寸模式在qt中是个枚举类型,如下:
enum ResizeMode
{
Interactive,
Stretch,
Fixed,
ResizeToContents,
Custom = Fixed
};
下面分别介绍各个值对表头的影响。
- Interactive ,交互模式,通过鼠标拖拽表格中间的分割线调整表格宽度。
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
- Stretch ,使每一列都相等,并占满表格宽度。
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
```
- Fixed 固定模式,这个模式一般与其他属性一起设置,比如手动设置列的宽度,设置最后一列自动拉伸。
~~~cpp
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableWidget->setColumnWidth(0, 30);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
- ResizeToContents ,列的宽度会根据列标题文字的宽度设置
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
以上列宽模式也可以混合使用,如已经设置了Stretch模式,但是觉得某一列宽度不合适,可以按照如下方式进行设置。
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableWidget->setColumnWidth(0, 30);
如果不设置第0列为QHeaderView::Fixed,则setColumnWidth(0, 30); 将不起作用。
3. 表格数据
3.1 插入数据
假设有一个表示学生成绩信息的数据结构如下:
typedef struct st_Student
{
QString stuNo;
QString name;
double chinese;
double math;
double english;
}stStudent;
QList<stStudent> stuInfoList
stuInfoList 中有5条数据,将数据添加到表格中:
foreach (stStudent studentInfo, stuInfoList)
{
setRowData(studentInfo);
}
void setRowData(const stStudent &stuInfo)
{
QStringList dataList;
dataList << stuInfo.stuNo << stuInfo.name << QString::number(stuInfo.chinese, 'f',2)
<< QString::number(stuInfo.math, 'f',2)<< QString::number(stuInfo.english, 'f',2);
//获取表格中数据的条数,作为新插入的行号
int row = ui->tableWidget->rowCount();
//从表格最后新增一行
ui->tableWidget->insertRow(row);
for (int col = 0; col < dataList.size(); ++col)
{
QTableWidgetItem *pItem = new QTableWidgetItem(dataList[col]);
ui->tableWidget->setItem(row, col, pItem);
}
}
3.2 QTableWidgetItem 详解
QTableWidgetItem 是显示和编辑单元格数据的类。它可以包含文本、图标和数据,并提供了一系列方法来设置和获取这些数据。以下是一些 QTableWidgetItem 的主要特点和用法:
- 构造函数:
QTableWidgetItem 提供了多个构造函数,可以根据需要传递不同的参数。最常见的构造函数是接受一个字符串作为参数的构造函数,用于设置单元格的文本值:
QTableWidgetItem *item = new QTableWidgetItem("Hello");
- 设置和获取文本值
item->setText("Hello");
QString text = item->text();
- 设置和获取图标
QIcon icon(":/images/icon.png");
item->setIcon(icon);
QIcon itemIcon = item->icon();
-
设置和获取数据:
QTableWidgetItem 可以保存自定义的数据:
stStudent stuInfo; QVariant data; data.setValue(stuInfo); item->setData(Qt::UserRole, data); // 保存自定义类型数据 QVariant data = item->data(Qt::UserRole); stStudent value = data.value<stStudent>();
-
设置文本对齐:
item->setTextAlignment(Qt::AlignCenter); // 文本居中对齐
Qt::Alignment alignment = item->textAlignment();
除了AlignCenter外还有 AlignLeft 、AlignRight 、AlignTop、AlignBottom、AlignVCenter等。
-
设置和获取编辑属性:
可以使用 setFlags(Qt::ItemFlags) 方法设置 QTableWidgetItem 的编辑属性
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable); // 允许选择和编辑
Qt::ItemFlags itemFlags = item->flags();
-
其他属性和方法:
QTableWidgetItem 还提供了许多其他属性和方法,如设置前景色、背景色、字体、工具提示等。你可以根据需要查阅 Qt 的官方文档来了解更多详细信息。
void setBackground(const QBrush &brush)//设置背景色
void setCheckState(Qt::CheckState state)//设置CheckBox选中状态
void setFont(const QFont &font)//设置字体
void setForeground(const QBrush &brush)//设置前景色
void setSelected(bool select)//设置是否选中
void setSizeHint(const QSize &size)//设置尺寸大小
void setToolTip(const QString &toolTip)//设置提示信息,当鼠标移到表格时自动显示该信息
- 总之,QTableWidgetItem 是在表格控件中用于显示和编辑单元格数据的重要类。它提供了丰富的功能和方法,可以根据需要设置和获取文本、图标、数据等属性,以满足表格数据的定制化需求。
4. 设置表格样式
本节将结合样式表和表格属性来设置表格的样式,下图是QtDesigner中QTableWidget的属性列表
4.1 设置表格背景
这里把表格背景设置为浅灰色
tableWidget->setStyleSheet("QTableWidget { background-color: lightgray; }");
4.2 设置表头样式
使用 QHeaderView 和 ::section 选择器来设置表头的样式,例如设置背景色和字体样式:
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section { background-color: gray; color: white; font-weight: bold; }");
4.3 设置单元格样式
使用 QTableWidget::item 选择器来设置单元格的样式,例如设置背景色和字体样式:
tableWidget->setStyleSheet("QTableWidget::item { background-color: lightblue; font-weight: bold; }");
4.4 设置选中行样式
使用 QTableWidget::item:selected 选择器来设置选中行的样式,例如设置背景色和字体颜色
tableWidget->setStyleSheet("QTableWidget::item:selected { background-color: blue; color: white; }");
4.5 设置边框样式
tableWidget->setStyleSheet("QTableWidget { border: 1px solid black; }");
4.6 设置交替背景色
设置交替背景色时有两点需要注意,一是需要设置属性alternatingRowColors为true;二是不要设置单元格的背景色,即样式表中不要在有这样的设置QTableWidget::item { background-color: lightblue; }
。
tableWidget->setAlternatingRowColors(true);
tableWidget->setStyleSheet("QTableWidget { alternate-background-color: lightblue; }");
4.7 设置单元格边框颜色
使用 gridline-color 属性来设置表格的边框样式,例如设置边框宽度和颜色:
tableWidget->setStyleSheet("QTableWidget { gridline-color: green; }");
4.8 设置单元格边框隐藏
tableWidget->setShowGrid(false);
4.9 合并单元格
假设在学生成绩表中最后一行需要统计各学科的总分数,可以用下面的代码设置合并单元格:
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
QTableWidgetItem *pItem = new QTableWidgetItem("各科总分");
pItem->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->setItem(row, 0, pItem);
ui->tableWidget->setSpan(row, 0, 1, 2);
setSpan函数原型 void setSpan(int row, int column, int rowSpan, int columnSpan);
其中row表示行,column表示列,rowSpan 为行跨度,这里是1,columnSpan 为列跨度,这里是2。
5. 与表格交互
5.1 选择
表格的选择效果一般需要selectionBehavior 和 selectionMode 这两个属性搭配设置,可以通过函数调用setSelectionBehavior、setSelectionMode 设置,也可以直接在Designer中设置。
SelectionBehavior 是枚举变量其可选值有3个,其含义为:
-
SelectItems 0 按单元格选择,根据SelectionMode的值不同,可以选择一个或多个单元格。
-
SelectRows 1 按一行选择,根据SelectionMode的值不同,可以选择一行或多行。
-
SelectColumns 2 按列选择,根据SelectionMode的值不同,可以选择一列或多列。
SelectionMode 也是枚举变量其可选值有5个,其含义为:
- NoSelection 0 不能选择任何单元格。
- SingleSelection 1 只能选择一个单元格或者一行或者一列,选中一个后之前选中的会自动取消。
- MultiSelection 2 当用户以普通方式选择一个单元格时,该单元格的选择状态将改变,而其他单元格将保持不变。用户可以通过拖动鼠标来选择多个单元格。
- ExtendedSelection 3 当用户以普通方式选择一个单元格时,选择会被清除并选择新的项目。然而,如果用户在点击一个项目时按下 Ctrl 键,被点击的单元格会切换选择状态,而其他单元格保持不变。如果用户在点击一个单元格时按住 Shift 键,当前单元格和点击的单元格之间的所有单元格(包括当前单元格和点击的单元格)将根据点击的单元格的状态被选择或取消选择。用户可以通过拖动鼠标来选择多个单元格。
- ContiguousSelection 4 当用户以普通方式选择一个单元格时,选择会被清除并选择新的单元格。然而,如果用户在点击一个单元格时按下 Shift 键,那么当前单元格和点击的单元格之间的所有单元格(包括当前单元格和点击的单元格)将根据点击的单元格的状态被选择或取消选择。
6. 查看QTableWidget某个单元格的数据
ui->jamTableWidget->item(0, 2)->text();