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();
}

 

posted @ 2024-04-30 15:09  [BORUTO]  阅读(106)  评论(0)    收藏  举报