Qt-自定义委托类QStyledItemDelegate实现在QTableview中插入comboBox,comboBox可动态插入数据

本文介绍如何在Qt的QTableView中使用自定义委托类QStyledItemDelegate来插入可编辑的comboBox,并且讲解了实现动态加载数据的原理。通过重写关键函数,如createEditor、updateEditorGeometry、setModelData和setEditorData,可以创建一个能够根据需求填充数据的comboBox。同时,还提供了自定义数据源的代码示例。
摘要由CSDN通过智能技术生成

效果:

在这里插入图片描述

实现原理:

自定义委托类,重写以下函数:
createEditor()
updateEditorGeometry()
setModelData()
setEditorData()

还可以重写**paint()**函数,绘制进度条,按钮等。

委托类代码:

.h

#ifndef CUSTOMERQSTYLEDITEMDELEGATE_H
#define CUSTOMERQSTYLEDITEMDELEGATE_H
#include <QStyledItemDelegate>

class CustomerQStyledItemDelegate : public QStyledItemDelegate
{
   
public:
    CustomerQStyledItemDelegate();
    ~CustomerQStyledItemDelegate(){
   }
protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
};

#endif // CUSTOMERQSTYLEDITEMDELEGATE_H

.cpp

#include "CustomerQStyledItemDelegate.h"
#include <QProgressBar>
#include <QApplication>
#include <QComboBox>
#include "mTableModel.h"
#include "QDebug"

CustomerQStyledItemDelegate::CustomerQStyledItemDelegate()
{
   

}

void CustomerQStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   
        QStyleOptionViewItem viewOption(option);
        initStyleOption(&viewOption, index);
        if (option.state.testFlag(QStyle::State_HasFocus))
            viewOption.state = viewOption.state ^ QStyle::State_HasFocus;

        QStyledItemDelegate::paint(painter, viewOption, index);

        if (index.column() == 2)
        {
   
            int nProgress = index.model()->data(index, Qt::UserRole).toInt();
            int nLeft = 8;
            int nTop = 8;
            int nWidth = option.rect.width() - 2 * nLeft;
            int nHeight = option.rect.height() - 2 * nTop;

            // 设置进度条的风格
            QStyleOptionProgressBar progressBarOption;
            progressBarOption.initFrom(option.widget);
            // 设置进度条显示的区域
            progressBarOption.rect = QRect(option.rect.left() + nLeft, option.rect.top() + nTop,  nWidth, nHeight);
            // 设置最小值
            progressBarOption
QtQTableView,可以通过自定义一个QStyledItemDelegate实现在表格插入图片的功能。具体步骤如下: 1. 继承QStyledItemDelegate,重写createEditor、setEditorData、setModelData、updateEditorGeometry和paint方法。 2. 在createEditor方法,创建一个QFileDialog,让用户选择图片文件。 3. 在setEditorData方法,将文件路径转换成QPixmap对象,然后将其设置为QLabel的pixmap。 4. 在setModelData方法,将QPixmap对象转换成QByteArray,然后将其存储到model。 5. 在updateEditorGeometry方法,设置QLabel的位置和大小。 6. 在paint方法,绘制QPixmap。 以下是一个简单的示例代码: ```cpp class ImageDelegate : public QStyledItemDelegate { public: QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override { Q_UNUSED(option); Q_UNUSED(index); QFileDialog* dialog = new QFileDialog(parent); dialog->setFileMode(QFileDialog::ExistingFile); dialog->setNameFilter(tr("Images (*.png *.xpm *.jpg)")); if (dialog->exec() != QDialog::Accepted) { return nullptr; } QLabel* editor = new QLabel(parent); QPixmap pixmap(dialog->selectedFiles().first()); editor->setPixmap(pixmap.scaledToHeight(40, Qt::SmoothTransformation)); editor->setAlignment(Qt::AlignCenter); editor->setFixedSize(pixmap.width() / 4, pixmap.height() / 4); return editor; } void setEditorData(QWidget* editor, const QModelIndex& index) const override { QString imagePath = index.model()->data(index, Qt::EditRole).toString(); QPixmap pixmap(imagePath); QLabel* label = static_cast<QLabel*>(editor); label->setPixmap(pixmap.scaledToHeight(40, Qt::SmoothTransformation)); } void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override { QPixmap pixmap = static_cast<QLabel*>(editor)->pixmap(Qt::ReturnByValue); QByteArray byteArray; QBuffer buffer(&byteArray); buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG"); model->setData(index, byteArray, Qt::EditRole); } void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override { Q_UNUSED(index); editor->setGeometry(option.rect); } void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { QByteArray imageData = index.model()->data(index, Qt::DisplayRole).toByteArray(); QPixmap pixmap; pixmap.loadFromData(imageData); painter->drawPixmap(option.rect, pixmap.scaled(option.rect.width() - 2, option.rect.height() - 2, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } }; ``` 然后在QTableView设置该delegate即可: ```cpp ImageDelegate* delegate = new ImageDelegate(); tableView->setItemDelegateForColumn(0, delegate); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值