本文演示了 QTableWidget的初始化以及单元格值改变时响应槽函数,打印单元格。
并且,最后列不一样,是combobox ,此列的槽函数用lambda函数。
在QT6.2.4 MSVC2019 调试通过。
1.界面效果
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.代码下载链接