QTableView使用代理向表格中添加控件
Published on 2022-05-27 21:31 in 分类: Qt with 萧海~
分类: Qt

QTableView使用代理向表格中添加控件

    一、效果展示
    在这里插入图片描述
    二、继承QItemDelegate实现自己的代理类
    主要是重写如下三个函数:

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const;

    Delegate.h

    #ifndef DELEGATE_H
    #define DELEGATE_H
    #include <QStyledItemDelegate>
    #include <QItemDelegate>
    #include <QModelIndex>
    #include <QPainter>
    #include <QWidget>
    #define COMBOXCOL 1
    class Delegate : public QItemDelegate
    {
    Q_OBJECT
    public:
    Delegate(QObject *parent = nullptr);
    ~Delegate();
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const;
    };
    #endif // DELEGATE_H

    Delegate.cpp

    #include "combobox_itemdelegate.h"
    #include <QComboBox>
    Delegate::Delegate(QObject *parent)
    : QItemDelegate(parent)
    {
    }
    Delegate::~Delegate()
    {
    }
    void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
    const QModelIndex &index) const
    {
    QItemDelegate::paint(painter, option, index);
    }
    QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
    return QItemDelegate::sizeHint(option, index);
    }
    QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const
    {
    if (index.isValid() && index.column() == COMBOXCOL)
    {
    QComboBox *editor = new QComboBox(parent);
    editor->setEditable(true);
    editor->installEventFilter(const_cast<Delegate *>(this));
    return editor;
    }
    else
    {
    return QItemDelegate::createEditor(parent, option, index);
    }
    }
    void Delegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
    if (index.isValid() && index.column() == COMBOXCOL)
    {
    QString value = index.model()->data(index, Qt::DisplayRole).toString();
    QComboBox *combox = static_cast<QComboBox *>(editor);
    combox->addItem("男");
    combox->addItem("女");
    combox->setCurrentText(value);
    }
    else
    {
    QItemDelegate::setEditorData(editor, index);
    }
    }
    void Delegate::setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const
    {
    if (index.isValid() && index.column() == COMBOXCOL)
    {
    QComboBox *combox = static_cast<QComboBox *>(editor);
    model->setData(index, combox->currentText());
    }
    else
    {
    QItemDelegate::setModelData(editor, model, index);
    }
    }

    调用类

    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    tableview = new QTableView(this->centralWidget());
    tableview->resize(500,500);
    tableviewModel = new QStandardItemModel;
    tableview->setModel(tableviewModel);
    QStringList headerList;
    headerList<<"姓名"<<"性别"<<"年龄";
    tableviewModel->setHorizontalHeaderLabels(headerList);
    tableviewModel->setItem(0,0,new QStandardItem("张三"));
    tableviewModel->setItem(1,0,new QStandardItem("李四"));
    tableviewModel->setItem(2,0,new QStandardItem("王二"));
    tableview->setSelectionBehavior(QAbstractItemView::SelectRows);//选择一行
    tableview->setItemDelegateForColumn(1, new Delegate(this));//添加QCombox代理
    }

    附第二种方法:

    m_button = new QPushButton("Download");
    //触发下载按钮的槽函数
    connect(m_button, SIGNAL(clicked(bool)), this, SLOT(ClickDownloadButton()));
    m_button->setProperty("row", i); //为按钮设置row属性
    m_button->setProperty("fileName", fileInfo.at(i).fileName); //为按钮设置fileName属性
    //m_button->setProperty("column", col)
    ui->downloadTable->setIndexWidget(model->index(model->rowCount() - 1, 3), m_button);
    posted @   萧海~  阅读(1232)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示
    电磁波切换