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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)