当前位置: 首页 > news >正文

QTableWidget 控件入门

1. 基本创建和设置

创建表格

cpp

#include <QTableWidget>
#include <QTableWidgetItem>// 创建表格控件
QTableWidget *tableWidget = new QTableWidget(5, 3); // 5行3列
tableWidget->setParent(this);// 或者动态设置行列数
tableWidget->setRowCount(10);    // 设置10行
tableWidget->setColumnCount(4);  // 设置4列

设置表头

cpp

​
// 设置列数
ui->tableWidgetMaxMin->setColumnCount(2);  // 必须先设置列数// 设置水平表头标签
QStringList horizontalHeaders;
horizontalHeaders << tr("Max") << tr("Min");
ui->tableWidgetMaxMin->setHorizontalHeaderLabels(horizontalHeaders);// 确保表头可见并设置合适的尺寸
ui->tableWidgetMaxMin->horizontalHeader()->setVisible(true);
ui->tableWidgetMaxMin->horizontalHeader()->setDefaultSectionSize(80);  // 列宽
ui->tableWidgetMaxMin->horizontalHeader()->setMinimumHeight(30);       // 表头最小高度// 如果需要,可以设置表头样式
ui->tableWidgetMaxMin->horizontalHeader()->setStyleSheet("QHeaderView::section {""    background-color: #e0e0e0;""    padding: 4px;""    border: 1px solid #cccccc;""    font-weight: bold;""}"
);​

隐藏行号和列号

// 同时隐藏行号和列号
tableWidget->verticalHeader()->setVisible(false);
tableWidget->horizontalHeader()->setVisible(false);

或者

// 使用样式表隐藏所有表头
tableWidget->setStyleSheet("QTableWidget::verticalHeader { width: 0px; }""QTableWidget::horizontalHeader { height: 0px; }"
);

设置所有行的高度

// 设置统一的行高度为50像素
ui->tableWidget->verticalHeader()->setDefaultSectionSize(50);// 或者使用setRowHeight方法(需要在有行的时候使用)
for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {ui->tableWidget->setRowHeight(row, 50);
}

2. 数据操作

添加数据

cpp

// 方法1:直接设置单元格内容
tableWidget->setItem(0, 0, new QTableWidgetItem("张三"));
tableWidget->setItem(0, 1, new QTableWidgetItem("25"));
tableWidget->setItem(0, 2, new QTableWidgetItem("工程师"));
tableWidget->setItem(0, 3, new QTableWidgetItem("8000"));// 方法2:创建带样式的项目
QTableWidgetItem *item = new QTableWidgetItem("李四");
item->setTextAlignment(Qt::AlignCenter);
item->setBackground(QBrush(QColor(240, 240, 240)));
item->setForeground(QBrush(QColor(0, 0, 0)));
tableWidget->setItem(1, 0, item);// 设置数字内容并右对齐
QTableWidgetItem *ageItem = new QTableWidgetItem();
ageItem->setData(Qt::EditRole, 30); // 对于数字,使用EditRole
ageItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
tableWidget->setItem(1, 1, ageItem);

批量添加数据

cpp

// 准备数据
QVector<QStringList> data = {{"王五", "28", "设计师", "7500"},{"赵六", "32", "经理", "12000"},{"钱七", "26", "开发", "9000"}
};for (int row = 0; row < data.size(); ++row) {for (int col = 0; col < data[row].size(); ++col) {QTableWidgetItem *item = new QTableWidgetItem(data[row][col]);tableWidget->setItem(row + 2, col, item);}
}

3. 样式和外观设置

基本样式

cpp

// 设置表格样式
tableWidget->setStyleSheet("QTableWidget {""    gridline-color: #d0d0d0;""    background-color: white;""    alternate-background-color: #f8f8f8;""    selection-background-color: #e3f2fd;""    selection-color: black;""}""QTableWidget::item {""    padding: 4px;""    border: none;""}""QTableWidget::item:selected {""    background-color: #bbdefb;""}"
);// 启用交替行颜色
tableWidget->setAlternatingRowColors(true);// 设置网格线
tableWidget->setShowGrid(true);
tableWidget->setGridStyle(Qt::SolidLine);// 设置选择行为
tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); // 单选
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);  // 整行选择// 设置编辑触发方式
tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

4. 列设置

列宽设置

cpp

// 设置列宽
tableWidget->setColumnWidth(0, 100);  // 第一列宽100
tableWidget->setColumnWidth(1, 80);   // 第二列宽80
tableWidget->setColumnWidth(2, 120);  // 第三列宽120
tableWidget->horizontalHeader()->setStretchLastSection(true); // 最后一列拉伸// 或者自动调整列宽
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 平均分配
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // 根据内容调整

隐藏列/显示列

cpp

tableWidget->setColumnHidden(3, true);  // 隐藏第4列(工资列)
// tableWidget->setColumnHidden(3, false); // 显示第4列

5. 信号和槽连接

常用信号连接

cpp

// 单元格内容改变
connect(tableWidget, &QTableWidget::cellChanged, [](int row, int column) {qDebug() << "单元格改变:" << row << "," << column;
});// 单元格被点击
connect(tableWidget, &QTableWidget::cellClicked, [](int row, int column) {qDebug() << "单元格点击:" << row << "," << column;
});// 单元格被双击
connect(tableWidget, &QTableWidget::cellDoubleClicked, [](int row, int column) {qDebug() << "单元格双击:" << row << "," << column;
});// 当前单元格改变
connect(tableWidget, &QTableWidget::currentCellChanged, [](int currentRow, int currentColumn, int previousRow, int previousColumn) {qDebug() << "当前单元格从" << previousRow << "," << previousColumn<< "变为" << currentRow << "," << currentColumn;
});

6. 数据获取和操作

获取数据

cpp

// 获取特定单元格数据
QTableWidgetItem *item = tableWidget->item(0, 0);
if (item) {QString text = item->text();qDebug() << "单元格内容:" << text;
}// 获取所有数据
for (int row = 0; row < tableWidget->rowCount(); ++row) {for (int col = 0; col < tableWidget->columnCount(); ++col) {QTableWidgetItem *item = tableWidget->item(row, col);if (item) {qDebug() << "行" << row << "列" << col << ":" << item->text();}}
}// 获取选中的行
QList<QTableWidgetItem*> selectedItems = tableWidget->selectedItems();
foreach (QTableWidgetItem *item, selectedItems) {qDebug() << "选中项:" << item->text() << "位于行" << item->row();
}

数据操作

cpp

// 插入行
tableWidget->insertRow(2); // 在第3行前插入新行// 删除行
tableWidget->removeRow(0); // 删除第1行// 清空表格
tableWidget->clearContents();        // 清空内容,保留表头
tableWidget->setRowCount(0);         // 删除所有行// 排序
tableWidget->sortByColumn(1, Qt::AscendingOrder); // 按第2列升序排序

7. 高级功能

自定义单元格控件

cpp

// 添加按钮到单元格
QPushButton *button = new QPushButton("操作");
tableWidget->setCellWidget(0, 3, button);connect(button, &QPushButton::clicked, [this]() {qDebug() << "按钮被点击";
});// 添加组合框
QComboBox *comboBox = new QComboBox();
comboBox->addItems({"选项1", "选项2", "选项3"});
tableWidget->setCellWidget(1, 2, comboBox);// 添加复选框
QCheckBox *checkBox = new QCheckBox("启用");
checkBox->setChecked(true);
tableWidget->setCellWidget(2, 3, checkBox);

上下文菜单

cpp

// 启用上下文菜单
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(tableWidget, &QTableWidget::customContextMenuRequested, [this](const QPoint &pos) {QMenu *menu = new QMenu(this);QAction *addAction = menu->addAction("添加行");QAction *deleteAction = menu->addAction("删除行");QAction *editAction = menu->addAction("编辑");QAction *selectedAction = menu->exec(tableWidget->viewport()->mapToGlobal(pos));if (selectedAction == addAction) {tableWidget->insertRow(tableWidget->currentRow() + 1);} else if (selectedAction == deleteAction) {tableWidget->removeRow(tableWidget->currentRow());}delete menu;
});

8. 完整示例

cpp

#include <QApplication>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QHeaderView>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);// 创建表格QTableWidget *table = new QTableWidget(5, 4);// 设置表头QStringList headers;headers << "ID" << "姓名" << "年龄" << "职业";table->setHorizontalHeaderLabels(headers);// 填充数据QStringList data[] = {{"1", "张三", "25", "工程师"},{"2", "李四", "30", "设计师"},{"3", "王五", "28", "经理"},{"4", "赵六", "35", "总监"},{"5", "钱七", "26", "开发"}};for (int row = 0; row < 5; ++row) {for (int col = 0; col < 4; ++col) {QTableWidgetItem *item = new QTableWidgetItem(data[row][col]);table->setItem(row, col, item);}}// 设置样式table->setStyleSheet("QTableWidget {""    gridline-color: #d0d0d0;""    background-color: white;""}""QHeaderView::section {""    background-color: #f0f0f0;""    padding: 4px;""    border: 1px solid #cccccc;""    font-weight: bold;""}");// 设置列宽table->setColumnWidth(0, 50);table->setColumnWidth(1, 100);table->setColumnWidth(2, 80);table->horizontalHeader()->setStretchLastSection(true);layout->addWidget(table);window.resize(600, 400);window.show();return app.exec();
}

9. 性能优化建议

cpp

// 批量操作时禁用刷新
tableWidget->setUpdatesEnabled(false);// 进行大量数据操作...
for (int i = 0; i < 1000; ++i) {tableWidget->insertRow(i);// 填充数据...
}// 操作完成后启用刷新
tableWidget->setUpdatesEnabled(true);// 或者使用阻塞信号
tableWidget->blockSignals(true);
// 进行数据操作...
tableWidget->blockSignals(false);

10. QTableWidget 完整样式

1). 基本表格样式

css

/* 表格整体样式 */
QTableWidget {background-color: white;border: 1px solid #d0d0d0;border-radius: 4px;gridline-color: #e0e0e0;outline: 0; /* 移除焦点边框 */alternate-background-color: #f8f8f8; /* 交替行背景色 */selection-background-color: #e3f2fd; /* 选中背景色 */selection-color: black; /* 选中文字颜色 */
}

2). 表头样式

css

/* 水平表头 */
QHeaderView::section:horizontal {background-color: #f0f0f0;padding: 12px 15px;border: 1px solid #cccccc;border-left: none;font-size: 14px;font-weight: bold;color: #333333;
}/* 垂直表头(行号) */
QHeaderView::section:vertical {background-color: #f0f0f0;padding: 8px;border: 1px solid #cccccc;border-top: none;font-size: 12px;color: #666666;
}/* 表头悬停效果 */
QHeaderView::section:hover {background-color: #e8e8e8;
}/* 表头按下效果 */
QHeaderView::section:pressed {background-color: #d8d8d8;
}/* 表头排序指示器 */
QHeaderView::section:sort-indicator {subcontrol-position: right center;
}

3). 单元格样式

css

/* 所有单元格基础样式 */
QTableWidget::item {font-size: 13px;font-family: 'Microsoft YaHei', 'Segoe UI';padding: 8px 10px;border: none;color: #333333;background-color: white;
}/* 交替行颜色 */
QTableWidget::item:alternate {background-color: #f8f8f8;
}/* 选中状态 */
QTableWidget::item:selected {background-color: #bbdefb;color: #000000;font-weight: bold;
}/* 悬停状态 */
QTableWidget::item:hover {background-color: #f5f5f5;
}/* 焦点状态 */
QTableWidget::item:focus {border: 2px solid #2196f3;background-color: #e3f2fd;
}/* 禁用状态 */
QTableWidget::item:disabled {color: #999999;background-color: #f0f0f0;
}

4). 行列样式

css

/* 特定列样式 */
QTableWidget::item[column="0"] {/* 第一列样式 */font-weight: bold;color: #1976d2;
}QTableWidget::item[column="1"] {/* 第二列样式 */text-align: center;
}QTableWidget::item[column="2"] {/* 第三列样式 */text-align: right;color: #388e3c;
}/* 特定行样式 */
QTableWidget::item[row="0"] {/* 第一行样式 */background-color: #fffde7;
}QTableWidget::item[row="last"] {/* 最后一行样式 */border-bottom: 2px solid #bdbdbd;
}

5). 滚动条样式

css

/* 垂直滚动条 */
QScrollBar:vertical {border: none;background-color: #f0f0f0;width: 12px;margin: 0px;
}QScrollBar::handle:vertical {background-color: #c0c0c0;border-radius: 6px;min-height: 30px;
}QScrollBar::handle:vertical:hover {background-color: #a0a0a0;
}QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {height: 0px;
}/* 水平滚动条 */
QScrollBar:horizontal {border: none;background-color: #f0f0f0;height: 12px;margin: 0px;
}QScrollBar::handle:horizontal {background-color: #c0c0c0;border-radius: 6px;min-width: 30px;
}QScrollBar::handle:horizontal:hover {background-color: #a0a0a0;
}QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {width: 0px;
}

6). 角落按钮样式

css

/* 表格角落按钮 */
QTableCornerButton::section {background-color: #f0f0f0;border: 1px solid #cccccc;border-top-left-radius: 3px;
}

7). 编辑状态样式

css

/* 编辑状态 */
QTableWidget::item:edit {background-color: #fff8e1;border: 2px solid #ffb300;
}/* 编辑器样式 */
QLineEdit {font-size: 13px;padding: 4px;border: 1px solid #bdbdbd;border-radius: 3px;background-color: white;
}QLineEdit:focus {border: 2px solid #2196f3;
}

8). 完整样式示例

css

QTableWidget {background-color: #ffffff;border: 1px solid #d0d0d0;border-radius: 6px;gridline-color: #e0e0e0;outline: 0;alternate-background-color: #fafafa;
}QTableWidget::item {font-size: 14px;font-family: 'Microsoft YaHei';padding: 10px 12px;border: none;color: #2c3e50;background-color: transparent;
}QTableWidget::item:selected {background-color: #3498db;color: white;font-weight: bold;
}QTableWidget::item:hover {background-color: #ecf0f1;
}QTableWidget::item:alternate {background-color: #f8f9fa;
}QHeaderView::section {background-color: #34495e;color: white;padding: 12px 15px;border: 1px solid #2c3e50;font-size: 14px;font-weight: bold;
}QHeaderView::section:hover {background-color: #2c3e50;
}QHeaderView::section:pressed {background-color: #1a2530;
}/* 滚动条样式 */
QScrollBar:vertical {background: #f1f1f1;width: 10px;
}QScrollBar::handle:vertical {background: #c1c1c1;border-radius: 5px;
}QScrollBar::handle:vertical:hover {background: #a8a8a8;
}

9). C++ 代码中的样式设置

cpp

void setupTableStyle()
{QString styleSheet = "QTableWidget {""    background-color: white;""    border: 1px solid #d0d0d0;""    gridline-color: #e0e0e0;""    alternate-background-color: #f8f8f8;""}""QTableWidget::item {""    font-size: 14px;""    font-family: 'Microsoft YaHei';""    padding: 8px;""    border: none;""    color: #333333;""}""QTableWidget::item:selected {""    background-color: #e3f2fd;""    color: black;""}""QHeaderView::section {""    background-color: #f0f0f0;""    padding: 10px;""    border: 1px solid #cccccc;""    font-weight: bold;""}";ui->tableWidget->setStyleSheet(styleSheet);// 启用交替行颜色ui->tableWidget->setAlternatingRowColors(true);// 设置行高ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);// 隐藏垂直表头ui->tableWidget->verticalHeader()->setVisible(false);
}

10). 响应式样式

cpp

// 根据屏幕DPI调整样式
void adjustTableStyleForDPI()
{int fontSize = 12;int padding = 6;int rowHeight = 35;// 根据DPI缩放qreal dpi = QApplication::primaryScreen()->logicalDotsPerInch() / 96.0;fontSize = qRound(fontSize * dpi);padding = qRound(padding * dpi);rowHeight = qRound(rowHeight * dpi);QString style = QString("QTableWidget::item {""    font-size: %1px;""    padding: %2px;""}""QHeaderView::section {""    font-size: %3px;""    padding: %4px;""}").arg(fontSize).arg(padding).arg(fontSize + 2).arg(padding + 2);ui->tableWidget->setStyleSheet(style);ui->tableWidget->verticalHeader()->setDefaultSectionSize(rowHeight);
}

QTableWidget 是一个功能丰富的控件,适合显示和编辑表格数据。对于非常大的数据集,考虑使用 QTableView 和自定义模型以获得更好的性能。

http://www.dtcms.com/a/392722.html

相关文章:

  • 【HarmonyOS】HMRouter配置与基本使用
  • 数据驱动下的实验设计与方差分析:从技术落地到方法论升维
  • 深度学习中的池化、线性层与激活函数
  • 【脑电分析系列】第22篇:EEG情绪识别与脑机接口(BCI)应用案例:机器学习与深度学习的实战
  • 深度学习知识点
  • 【pdf】如何将网页转换为pdf?
  • 家庭劳务智能机器人:从“科幻设想”到“推门而入”还有多远?
  • C++后台开发工具链实战
  • PortAudio--Cross-platform Open-Source Audio I/O Library
  • Oracle根据日期进行查询
  • 【C#】C# 中 `ProcessStartInfo` 详解:启动外部进程
  • Python快速入门专业版(三十六):Python列表基础:创建、增删改查与常用方法(15+案例)
  • 微服务项目->在线oj系统(Java-Spring)----5.0
  • 【读书笔记】《鲁迅传》
  • Python 基础:列表、字符串、字典和元组一些简单八股
  • C++ 运算符重载:类内与类外重载详解
  • 【java】jsp被截断问题
  • 在Windows10 Edge浏览器里安装DeepSider大模型插件来免费使用gpt-4o、NanoBanana等AI大模型
  • 车联网网络安全:技术演进与守护智能出行
  • 网络原理-传输层补充1
  • Amber `rism1d` 深度解析与实战教程
  • vscode在断点旁边写expression让条件为true的时候才触发断点提高调试效率
  • 何时使用RESETLOGS
  • 分布式链路追踪关键指标实战:精准定位服务调用 “慢节点” 全指南(一)
  • vaapi硬解码性能评估
  • 第 N 个泰波那契数
  • 面试经典150题[037]:矩阵置零(LeetCode 73)
  • mysql 简单操作
  • Maven:Java项目的自动化构建工具
  • 嵌入式硬件工程师每日提问