当前位置: 首页 > news >正文

【转载】Qt中QStyledItemDelegate的使用(一)

Qt中的代理是用于常见的QTreeView、QListView和QTableView中的一个小工具,它控制视图中每一项的显示方式。当然Qt还提供了QColumnView可供使用,但是我对它不太熟不知道该视图能不能编辑。为了方便开发者自定义项目的显示方式,减少自定义项目带来的需修改的代码量,Qt提供了代理的功能。其中一个名为QStyledItemDelegate的代理可以自定义项目处于编辑状态时的显示方式。比如双击某一项目时用自己的编辑框代替系统默认的编辑框。

QStyledItemDelegate是Qt推荐使用的代理,和它相似的还有QItemDelegate可以用。如果你想修改整个视图的显示方式,请采用自定义视图的方式而不是自定义代理。下面我将给出一个关于QStyledItemDelegate的简单例子给初学者参考。下面的代码测试环境是VS2017和Qt5.9。代码运行效果如下。从图中可看出,复选框代替了编辑状态下系统默认的编辑框:

image

 头文件:

 1 namespace Qt
 2 {
 3     enum CheckDataRole
 4     {
 5         ResultRole = Qt::UserRole, /* 自定义的Role,用来放布尔类型的编辑结果 */
 6     };
 7 }
 8 
 9 class MCheckDelegate : public QStyledItemDelegate
10 {
11     Q_OBJECT
12 
13 public:
14     explicit MCheckDelegate(QObject *parent = 0);
15     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
16     void setEditorData(QWidget *editor, const QModelIndex &index) const override;
17     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
18     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
19 };

CPP文件:

 1 MCheckDelegate::MCheckDelegate(QObject *parent) :
 2     QStyledItemDelegate(parent)
 3 {
 4 }
 5 
 6 QWidget *MCheckDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 7 {
 8     const QString style = u8R"(QCheckBox {
 9         padding-left: 4px;
10         background-color: white;
11         })";
12     QCheckBox* cbBox = new QCheckBox(u8"启用/禁用", parent);
13     cbBox->setStyleSheet(style);
14     return cbBox;
15 }
16 
17 void MCheckDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
18 {
19     QCheckBox* cbWidget = dynamic_cast<QCheckBox*>(editor);
20     cbWidget->setChecked(index.data(Qt::DisplayRole).toString() == u8"启用");
21 }
22 
23 void MCheckDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
24 {
25     bool state = dynamic_cast<QCheckBox*>(editor)->isChecked();
26     model->blockSignals(true);
27     model->setData(index, state ? u8"启用" : u8"禁用", Qt::DisplayRole);
28     model->blockSignals(false);
29     model->setData(index, state, Qt::ResultRole);
30 }
31 
32 void MCheckDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
33 {
34     editor->setGeometry(option.rect);
35 }

主窗口构造函数代码如下。本例中QtTest是主窗口类,ui.tvHost是QTableView控件:

 1 QtTest::QtTest(QWidget *parent)
 2     : QMainWindow(parent)
 3 {
 4     ui.setupUi(this);
 5 
 6     ui.tvHost->setItemDelegateForColumn(0, new MCheckDelegate(ui.tvHost));
 7     QStandardItemModel* model = new QStandardItemModel(ui.tvHost);
 8     model->setHorizontalHeaderLabels({ u8"状态", u8"说明" });
 9     model->setVerticalHeaderLabels({ u8"设备1", u8"设备2", u8"设备3", u8"设备4" });
10     model->setColumnCount(2);
11     model->setRowCount(4);
12     for (int i = 0; i < 4; i++)
13     {
14         model->setItem(i, 0, new QStandardItem(u8"启用"));
15         model->setItem(i, 1, new QStandardItem(u8"说明文字"));
16     }
17     ui.tvHost->setModel(model);
18 }

转载自:https://www.cnblogs.com/mengxiangdu/p/17815515.html

http://www.zskr.cn/news/83457.html

相关文章:

  • 2025年聚合物修补料销售厂家推荐,精选修补料砂浆供应商 - 讯息观点
  • 学习路线
  • GPT-0: Attention+Transformer+可视化 - 详解
  • 【Prompt 2】:提高产出效率
  • 2025年离心机国内知名厂家,离心机品牌排行推荐,离心机头部企业优质供应商,离心机有哪些厂 - 品牌推荐大师1
  • Curl → Python / YAML转换器
  • 2025年12月有实力/质量好/口碑好/信用好的实验室通风柜实验台生产厂家有哪些? - 品牌推荐大师
  • 2025年12月GPU平台选哪家?权威推荐智算认证,无隐性收费测评榜 - AIEO
  • 2025数控车铣复合机床厂家:实力与特色之选 - 栗子测评
  • AC700开启linein通道方法
  • 2025热流道系统哪家好?热流道厂家推荐品质之选 - 栗子测评
  • 2025年质量好的郑州气体报警器厂家最新推荐权威榜 - 朴素的承诺
  • 在windows平台搭建一个mini版本的k8s集群
  • Java基础——方法 - 详解
  • 【 Java八股文面试 | Redis篇 缓存疑问、持久化、分布式锁 】
  • B站学习视频
  • 2025气模厂家标杆榜:气模/滑梯/水上乐园/城堡/游乐场/运动/嘉年华/美陈/帐篷/设计综合指南,广州丽丽玩具以25年匠心,让欢乐气模风靡全球 - 海棠依旧大
  • 2025水上游乐设备厂家推荐榜:水上/闯关/城堡/游乐场、支架泳池、充气玩具、智能充气系统、户外游乐、游乐/夹网布/文旅/气模,广州丽丽玩具以安全与创新引领潮流 - 海棠依旧大
  • 使用 BR 备份 TiDB 到 AWS S3 存储 - 教程
  • 2025年12月上海老房翻新,上海老破小改造翻新,上海美式风老房翻新公司推荐:资质案例售后全解析​ - 品牌鉴赏师
  • openresty共享内存的使用
  • 聚焦2025服务器电源连接器厂家推荐:解锁服务器连接器厂家推 - 栗子测评
  • 202. 快乐数
  • 2025年12月佛山门窗源头厂家推荐:铝合金门窗,系统门窗,断桥铝门窗,别墅门窗,静音门窗,耐用门窗,封阳台门窗,推拉门窗厂家实力解读与选购指南 - 海棠依旧大
  • 2025年12月可折叠变径送风软管,机场送风软管,pvc送风软管厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 2025残卫报警器厂家推荐:纠结残卫报警器哪家好,看这篇 - 栗子测评
  • paramiko模块介绍
  • 弹簧机厂家哪家好?2025高性能自动弹簧机厂商实力榜单 - 栗子测评
  • 2025年12月江苏新沂PC砖、路沿石、透水砖、条纹砖、树池生产厂家顶尖公司综合评估报告 - 2025年11月品牌推荐榜
  • 2025年12月气动增压泵,气体增压泵,空气增压泵厂家推荐:增压设备行业权威盘点与品质红榜发布​ - 品牌鉴赏师