本文演示了 QTableWidget的初始化以及单元格值改变时响应槽函数,打印单元格。

并且,最后列不一样,是combobox ,此列的槽函数用lambda函数

在QT6.2.4 MSVC2019 调试通过。

1.界面效果

QT C++ QTableWidget 演示-LMLPHP

2.头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initUI();
    void tableChange(QTableWidgetItem *item);
  

private:
    Ui::MainWindow *ui;
    QTableWidget *tableWidget;
};
#endif // MAINWINDOW_H
 

3.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QComboBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initUI();
}
void MainWindow::initUI()
{
    tableWidget = new QTableWidget(this);
    tableWidget->setFixedSize(350, 200);
    tableWidget->setRowCount(5);
    tableWidget->setColumnCount(3);
    QStringList headerLabels;
    headerLabels << "col1" << "col2" << "col3" ;
    tableWidget->setHorizontalHeaderLabels(headerLabels);//用QStringList初始化水平表头
    setContextMenuPolicy(Qt::CustomContextMenu);
    for (int row = 0; row < tableWidget->rowCount(); ++row)//遍历所有行,单元格初始化
    {
        tableWidget->setItem(row, 0, new QTableWidgetItem(""));//初始化第1列
        tableWidget->setItem(row, 1, new QTableWidgetItem(""));//初始化第2列
        tableWidget->setItem(row, 2, new QTableWidgetItem(""));//初始化第3列

        QComboBox *comboBox = new QComboBox();
        comboBox->addItem("选项1");
        comboBox->addItem("选项2");
        comboBox->addItem("选项3");

         comboBox->setStyleSheet("background-color: blue;");//背景色
        QTableWidgetItem *item0 = tableWidget->item(row, 0);
        item0->setText(QString::number(row));
        item0->setBackground(Qt::green);//背景色
        QTableWidgetItem *item1 = tableWidget->item(row, 1);
        item1->setText(QString::number(row+5));
         item1->setBackground(Qt::darkYellow);//背景色
        tableWidget->setCellWidget(row, 2, comboBox);//将第2列的单元格设置combox选项

        // 连接信号和槽,并使用Lambda表达式来传递参数

         //第3列,经过lambda中转,连到了tableChange
        connect(comboBox,
                QOverload<int>::of(&QComboBox::currentIndexChanged),
                this,
                [this, comboBox, row](int index)//本行及下面的几行直到 } 是lambda函数范围
                {   // 获取第2列的QTableWidgetItem对象作为参数
                    QTableWidgetItem *item = tableWidget->item(row, 2);
                    if (item)//判断非空
                        tableChange(item);
                    else
                        qDebug() << "获取QTableWidgetItem时发生错误";
                }
                );
    }
    tableWidget->show();

    //第1列和第2列是普通列,直接连槽函数
    connect(tableWidget, &QTableWidget::itemChanged, this, &MainWindow::tableChange, Qt::UniqueConnection);
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::tableChange(QTableWidgetItem *item)
{
    int row = item->row();
    int column = item->column();
    QString str ;
    if (column==2)
    {
        QComboBox *comboBox = qobject_cast<QComboBox*>(tableWidget->cellWidget(row, 2));
        str=comboBox->currentText();
    }
    else
        str=item->text();
    // 打印输出已改变内容的行和列
    qDebug() << "Item changed at row:" << row << ",column:" << column<<",value:" << str;


    
}


4.代码下载链接

https://download.csdn.net/download/weixin_39926429/89345992

05-24 08:15