QTableWidget
是 Qt 中一个非常有用的控件,用于显示和操作表格数据。它继承自 QTableView
,提供了更高级别的 API,便于使用。下面是 QTableWidget
的详细开发指南,包括创建、插入和删除数据、遍历数据、信号和槽、设置单元格属性、以及右键菜单的实现。
一、QTablewidget基本使用
1.1 创建 QTableWidget
QTableWidget *tableWidget = new QTableWidget(5, 3, this); // 创建一个5行3列的表格
1.2 QTableWidget设置表头
QStringList headers;
headers << "Column 1" << "Column 2" << "Column 3";
tableWidget->setHorizontalHeaderLabels(headers);
二、QTablewidget插入和删除数据
2.1 QTablewidget插入数据
2.1.1 插入数据到单元格
通过创建 QTableWidgetItem 对象,并将其插入到指定的单元格中。
QTableWidgetItem *newItem1 = new QTableWidgetItem("Data 1");
QTableWidgetItem *newItem2 = new QTableWidgetItem("Data 2");
QTableWidgetItem *newItem3 = new QTableWidgetItem("Data 3");
tableWidget->setItem(0, 0, newItem1); // 插入到第0行第0列
tableWidget->setItem(0, 1, newItem2); // 插入到第0行第1列
tableWidget->setItem(0, 2, newItem3); // 插入到第0行第2列
2.1.2 插入数据到特定行列
可以使用循环插入数据到多个单元格中。
for (int row = 0; row < 5; ++row) {
for (int col = 0; col < 3; ++col) {
QTableWidgetItem *item = new QTableWidgetItem(QString("Row %1, Col %2").arg(row).arg(col));
tableWidget->setItem(row, col, item);
}
}
2.2 QTablewidget插入新行和列
tableWidget->insertRow(2); // 插入一行到第2行
tableWidget->insertColumn(1); // 插入一列到第1列
2.3 QTablewidget删除行和列
removeRow: 删除指定的行
removeRow:删除指定的列
tableWidget->removeRow(2); // 删除第2行
tableWidget->removeColumn(1); // 删除第1列
三、获取和设置单元格数据
3.1 QTablewidget获取单元格数据
QTableWidgetItem *item = tableWidget->item(0, 0);
QString text = item->text();
3.2 QTablewidget设置单元格数据
QTableWidgetItem *item = new QTableWidgetItem("New Text");
tableWidget->setItem(0, 0, item);
四 、QTablewidget遍历数据
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:" << row << "Column:" << col << "Text:" << item->text();
}
}
}
五、QTablewidget信号与槽
5.1 QTablewidget常用信号
itemClicked(QTableWidgetItem *item)
: 单击某个单元格时发射。itemDoubleClicked(QTableWidgetItem *item)
: 双击某个单元格时发射。itemChanged(QTableWidgetItem *item)
: 某个单元格的内容改变时发射。itemSelectionChanged()
: 选择改变时发射。
5.2 连接信号和槽
connect(tableWidget, &QTableWidget::itemClicked, this, &MainWindow::onItemClicked);
void MainWindow::onItemClicked(QTableWidgetItem *item) {
qDebug() << "Item clicked:" << item->text();
}
六、设置单元格属性
6.1 QTablewidget设置只读
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
6.2 QTablewidget设置对齐方式
item->setTextAlignment(Qt::AlignCenter);
6.3 QTablewidget设置背景色
item->setBackground(Qt::yellow);
6.4 QTablewidget设置字体
QFont font;
font.setBold(true);
item->setFont(font);
七、右键菜单
7.1 自定义右键菜单
- 在头文件中声明槽函数:
private slots:
void onCustomContextMenuRequested(const QPoint &pos);
void onDeleteRow();
- 在实现文件中实现槽函数:
void MainWindow::onCustomContextMenuRequested(const QPoint &pos) {
QMenu contextMenu(tr("Context menu"), this);
QAction action1("Delete Row", this);
connect(&action1, &QAction::triggered, this, &MainWindow::onDeleteRow);
contextMenu.addAction(&action1);
contextMenu.exec(tableWidget->viewport()->mapToGlobal(pos));
}
void MainWindow::onDeleteRow() {
int row = tableWidget->currentRow();
tableWidget->removeRow(row);
}
- 在构造函数中连接信号和槽:
connect(tableWidget, &QTableWidget::customContextMenuRequested, this, &MainWindow::onCustomContextMenuRequested);
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
八、示例代码
以下是一个完整的示例代码,用于创建一个 QTableWidget
并实现右键菜单功能:
#include <QApplication>
#include <QMainWindow>
#include <QTableWidget>
#include <QMenu>
#include <QDebug>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
tableWidget = new QTableWidget(5, 3, this);
QStringList headers;
headers << "Column 1" << "Column 2" << "Column 3";
tableWidget->setHorizontalHeaderLabels(headers);
setCentralWidget(tableWidget);
connect(tableWidget, &QTableWidget::customContextMenuRequested, this, &MainWindow::onCustomContextMenuRequested);
tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
}
private slots:
void onCustomContextMenuRequested(const QPoint &pos) {
QMenu contextMenu(tr("Context menu"), this);
QAction action1("Delete Row", this);
connect(&action1, &QAction::triggered, this, &MainWindow::onDeleteRow);
contextMenu.addAction(&action1);
contextMenu.exec(tableWidget->viewport()->mapToGlobal(pos));
}
void onDeleteRow() {
int row = tableWidget->currentRow();
tableWidget->removeRow(row);
}
private:
QTableWidget *tableWidget;
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "main.moc"
其他QT文章
1. QT开发环境安装以配置。
2. QT线段画板实战
3. 半小时玩转QT桌面系统托盘(含托盘消息)
4. QT入门开发一个时钟
5. 半小时教你做大转盘游戏(QT篇)
6. 手把手教你制作【带吸附效果的线段绘制】(QT)
7. 手把手教你开发-滚动效果号码抽奖(QT)
8. 100行代码实现贪吃蛇小游戏
9.C++实现《扫雷》游戏(入门经典)
10. svg转图片工具开发
11. Qt网路与通信(获取本机网络信息)
12. Qt网路与通信(UDP客户与服务)
13. Qt网络与通信(TCP聊天室)
14. Qt多线程以及线程池
15. Qt散点图、折线图、柱状图、盒须图、饼状图、雷达图开发实例
16. 取色器(QT)
17. MQTT客户端入门开发
18.QT文件上传带进度条实例(含源码)
19. Qt音乐播放器开发实例(可毕设含源码)
20. Qt学生管理系统-- 数据库课程设计(付源码)