QTablewidget开发详解

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 自定义右键菜单

  1. 在头文件中声明槽函数
private slots:
    void onCustomContextMenuRequested(const QPoint &pos);
    void onDeleteRow();
  1. 在实现文件中实现槽函数
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);
}
  1. 在构造函数中连接信号和槽
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学生管理系统-- 数据库课程设计(付源码)

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三雷科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值