Qt - QTableWidget+QTableWidgetItem 自定义控件
运行结果:

文件目录:

customtablewidget.h
#ifndef CUSTOMTABLEWIDGET_H
#define CUSTOMTABLEWIDGET_H
#include <QWidget>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QPushButton>
#include <QLabel>
#include <QTableWidgetItem>
class CustomTableItem : public QWidget
{
Q_OBJECT
public:
explicit CustomTableItem(QTableWidgetItem *bindItem, QWidget *parent = nullptr);
void updateDisplay(); // 同步数据到控件显示
int getValue() const; // 获取当前值
// 添加获取绑定项的公有方法
QTableWidgetItem* getBindItem() const { return m_bindItem; }
signals:
void valueChanged(int newValue); // 数值变化信号
private:
QTableWidgetItem *m_bindItem; // 绑定的表格项
QSpinBox *m_spinBox;
QPushButton *m_button;
};
#endif // CUSTOMTABLEWIDGET_H
customtablewidget.cpp
#include "customtablewidget.h"
#include <QDebug>
CustomTableItem::CustomTableItem(QTableWidgetItem *bindItem, QWidget *parent)
: QWidget(parent), m_bindItem(bindItem)
{
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setContentsMargins(2, 2, 2, 2);
// 数值调节控件
m_spinBox = new QSpinBox(this);
m_spinBox->setRange(0, 100);
m_spinBox->setValue(m_bindItem->data(Qt::UserRole).toInt());
// 操作按钮
m_button = new QPushButton("Apply", this);
layout->addWidget(m_spinBox, 4);
layout->addWidget(m_button, 1);
// 连接信号槽
connect(m_button, &QPushButton::clicked, [this](){
emit valueChanged(m_spinBox->value());
});
}
void CustomTableItem::updateDisplay()
{
m_spinBox->setValue(m_bindItem->data(Qt::UserRole).toInt());
}
int CustomTableItem::getValue() const
{
return m_spinBox->value();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void initTableWidget();
public slots:
void onValueChanged(int newValue);
private:
Ui::Widget *ui;
QTableWidget* m_tableWidget;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "customtablewidget.h"
#include <QHeaderView>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
initTableWidget();
}
Widget::~Widget()
{
delete ui;
}
void Widget::initTableWidget()
{
// 初始化表格
m_tableWidget = new QTableWidget(this);
m_tableWidget->setColumnCount(3);
m_tableWidget->setHorizontalHeaderLabels({"ID", "Name", "Value"});
//m_tableWidget->verticalHeader()->setVisible(false);
m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); // 禁用直接编辑
// 设置列宽策略
m_tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
m_tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
m_tableWidget->setColumnWidth(2, 150);
// 添加示例数据
for(int row = 0; row < 5; ++row) {
m_tableWidget->insertRow(row);
// 第一列:ID
QTableWidgetItem *idItem = new QTableWidgetItem(QString::number(row+1));
m_tableWidget->setItem(row, 0, idItem);
// 第二列:名称
QTableWidgetItem *nameItem = new QTableWidgetItem(QString("Item %1").arg(row+1));
m_tableWidget->setItem(row, 1, nameItem);
// 第三列:自定义控件
QTableWidgetItem *valueItem = new QTableWidgetItem();
valueItem->setData(Qt::UserRole, 50); // 初始化值
m_tableWidget->setItem(row, 2, valueItem);
// 创建自定义控件
CustomTableItem *customWidget = new CustomTableItem(valueItem);
connect(customWidget, &CustomTableItem::valueChanged,
this, &Widget::onValueChanged);
m_tableWidget->setCellWidget(row, 2, customWidget);
}
// 主布局
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(m_tableWidget);
this->setLayout(mainLayout);
}
//处理数值变化
void Widget::onValueChanged(int newValue)
{
// 通过信号发送者获取控件对象
if(auto widget = qobject_cast<CustomTableItem*>(sender())) {
// 获取绑定的表格项
QTableWidgetItem *item = widget->getBindItem();
// 更新数据
item->setData(Qt::UserRole, newValue);
qDebug() << "Row:" << item->row()
<< "New value:" << newValue;
}
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}

浙公网安备 33010602011771号