qt5的mvc实现,model总共8列数据,代理其中第7列为icon+文本,请思考一下,给出c++代码示例

时间: 2024-03-20 19:41:30 浏览: 21
好的,以下是一个简单的 Qt5 MVC 实现,其中包括一个模型(Model)、一个代理(Delegate)和一个视图(View)。模型中包含8列数据,第7列为图标和文本,代理用于呈现第7列数据。 Model.h: ```cpp #ifndef MODEL_H #define MODEL_H #include <QAbstractTableModel> #include <QList> class Model : public QAbstractTableModel { public: Model(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; private: QList<QList<QVariant>> m_data; }; #endif // MODEL_H ``` Model.cpp: ```cpp #include "Model.h" #include <QIcon> Model::Model(QObject *parent) : QAbstractTableModel(parent) { // 初始化模型数据 QList<QVariant> row; row << 1 << "Item 1" << "Description 1" << "Value 1" << "Note 1" << "Tag 1" << QIcon(":/icons/icon1.png") << "Status 1"; m_data << row; row.clear(); row << 2 << "Item 2" << "Description 2" << "Value 2" << "Note 2" << "Tag 2" << QIcon(":/icons/icon2.png") << "Status 2"; m_data << row; } int Model::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return m_data.size(); } int Model::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return 0; return 8; } QVariant Model::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) return m_data[index.row()][index.column()]; else if (role == Qt::DecorationRole && index.column() == 6) return m_data[index.row()][index.column()].value<QIcon>(); else return QVariant(); } QVariant Model::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { switch (section) { case 0: return QString("ID"); case 1: return QString("Item"); case 2: return QString("Description"); case 3: return QString("Value"); case 4: return QString("Note"); case 5: return QString("Tag"); case 6: return QString("Icon"); case 7: return QString("Status"); default: return QVariant(); } } return QVariant(); } Qt::ItemFlags Model::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return QAbstractTableModel::flags(index); } ``` Delegate.h: ```cpp #ifndef DELEGATE_H #define DELEGATE_H #include <QStyledItemDelegate> class Delegate : public QStyledItemDelegate { public: Delegate(QObject *parent = nullptr); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; #endif // DELEGATE_H ``` Delegate.cpp: ```cpp #include "Delegate.h" #include <QComboBox> #include <QLineEdit> #include <QPainter> Delegate::Delegate(QObject *parent) : QStyledItemDelegate(parent) { } QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 6) { QComboBox *editor = new QComboBox(parent); editor->addItem(QIcon(":/icons/icon1.png"), "Icon 1"); editor->addItem(QIcon(":/icons/icon2.png"), "Icon 2"); editor->addItem(QIcon(":/icons/icon3.png"), "Icon 3"); return editor; } else { return QStyledItemDelegate::createEditor(parent, option, index); } } void Delegate::setEditorData(QWidget *editor, const QModelIndex &index) const { if (index.column() == 6) { QComboBox *comboBox = qobject_cast<QComboBox *>(editor); comboBox->setCurrentIndex(comboBox->findText(index.data().toString())); } else { QStyledItemDelegate::setEditorData(editor, index); } } void Delegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { if (index.column() == 6) { QComboBox *comboBox = qobject_cast<QComboBox *>(editor); model->setData(index, comboBox->currentText()); } else { QStyledItemDelegate::setModelData(editor, model, index); } } void Delegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 6) { editor->setGeometry(option.rect); } else { QStyledItemDelegate::updateEditorGeometry(editor, option, index); } } void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 6) { QIcon icon = index.data(Qt::DecorationRole).value<QIcon>(); QString text = index.data(Qt::DisplayRole).toString(); QRect rect = option.rect; QRect iconRect(rect.left() + 2, rect.top() + 2, 16, 16); QRect textRect(rect.left() + 20, rect.top(), rect.width() - 20, rect.height()); icon.paint(painter, iconRect, Qt::AlignLeft | Qt::AlignVCenter); painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text); } else { QStyledItemDelegate::paint(painter, option, index); } } ``` View.h: ```cpp #ifndef VIEW_H #define VIEW_H #include <QTableView> class View : public QTableView { public: View(QWidget *parent = nullptr); private: void setupModel(); void setupDelegate(); }; #endif // VIEW_H ``` View.cpp: ```cpp #include "View.h" #include "Model.h" #include "Delegate.h" View::View(QWidget *parent) : QTableView(parent) { setSelectionMode(QAbstractItemView::SingleSelection); setSelectionBehavior(QAbstractItemView::SelectRows); setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked); setAlternatingRowColors(true); setupModel(); setupDelegate(); } void View::setupModel() { Model *model = new Model(this); setModel(model); } void View::setupDelegate() { Delegate *delegate = new Delegate(this); setItemDelegate(delegate); } ``` 在这个示例中,我们为第7列数据创建了一个自定义代理。代理中创建了一个`QComboBox`,其中包含三个图标和文本,用于选择图标。在`paint()`方法中,代理将图标和文本呈现在单元格中。在`createEditor()`、`setEditorData()`和`setModelData()`方法中,代理将`QComboBox`与模型中的数据进行交互。 请注意,此示例中使用的图标应该存储在项目资源中,可以使用Qt的资源系统进行管理。

相关推荐

最新推荐

recommend-type

基于QT C++实现的数据结构软件设计报告

哈工大(威海)计算机科学与技术学院 软件设计程序II的实验报告,基于QT,C++实现的简单饮食健康助手小程序,具有一定的数据结构知识的构建。原作者,可私聊源码。
recommend-type

pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

今天小编就为大家分享一篇pyqt5对用qt designer设计的窗体实现弹出子窗口的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Python+Qt5+Pycharm 界面设计.docx

最近小白需要做一个计算器,但是计算机编程能力几乎没有,所以各种查阅资料,最终确认使用Python+Qt5+Pycharm做一个界面。但是过程中遇到太多的坑,所以想把过程和方法记录下来,供大家参考。
recommend-type

C++实现幸运大抽奖(QT版)

主要为大家详细介绍了C++实现幸运大抽奖,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Qt实现保存、浏览、预览、打印功能的示例代码

下面小编就为大家分享一篇Qt实现保存、浏览、预览、打印功能的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SPDK_NVMF_DISCOVERY_NQN是什么 有什么作用

SPDK_NVMF_DISCOVERY_NQN 是 SPDK (Storage Performance Development Kit) 中用于查询 NVMf (Non-Volatile Memory express over Fabrics) 存储设备名称的协议。NVMf 是一种基于网络的存储协议,可用于连接远程非易失性内存存储器。 SPDK_NVMF_DISCOVERY_NQN 的作用是让存储应用程序能够通过 SPDK 查询 NVMf 存储设备的名称,以便能够访问这些存储设备。通过查询 NVMf 存储设备名称,存储应用程序可以获取必要的信息,例如存储设备的IP地址、端口号、名称等,以便能
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。