news 2026/10/31 10:40:46

Qt自定义委托实现定制输入的效果

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt自定义委托实现定制输入的效果

Qt自定义委托实现定制输入的效果

参考博客link 。以下是根据这篇博客修改而来。并写上了自己在编写过程中觉得应该注意的地方。
widget.cpp

#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);QVBoxLayout*vbox=newQVBoxLayout;QTreeView*treeView=newQTreeView;myDelegate*delegate=newmyDelegate;QStandardItemModel*model=newQStandardItemModel;//QTreeView常用的设置treeView->setSelectionMode(QAbstractItemView::SingleSelection);treeView->setSelectionBehavior(QAbstractItemView::SelectItems);treeView->setAlternatingRowColors(true);//设置标题model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("年级/班级")<<QStringLiteral("姓名")<<QStringLiteral("分数")<<QStringLiteral("评价"));//表头相关的设置treeView->header()->setStretchLastSection(true);//最后一列自适应宽度//往model里面添加数据//一级节点只有 班级列的数据for(inti=0;i<5;i++){QStandardItem*item=newQStandardItem(QStringLiteral("%1年级").arg(i+1));model->appendRow(item);for(intj=0;j<5;j++){QStandardItem*item1_0=newQStandardItem(QStringLiteral("%1班").arg(j+1));QStandardItem*item1_1=newQStandardItem(QStringLiteral("Tom"));QStandardItem*item1_2=newQStandardItem(QStringLiteral("100"));QStandardItem*item1_3=newQStandardItem(QStringLiteral("差"));item->appendRow(QList<QStandardItem*>()<<item1_0<<item1_1<<item1_2<<item1_3);}}treeView->setModel(model);treeView->setItemDelegate(delegate);vbox->addWidget(treeView);setLayout(vbox);}Widget::~Widget(){deleteui;}

widget.h

#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QVBoxLayout>#include<QTreeView>#include<QStandardItemModel>#include"mydelegate.h"namespaceUi{classWidget;}classWidget:publicQWidget{Q_OBJECTpublic:explicitWidget(QWidget*parent=nullptr);~Widget();private:Ui::Widget*ui;};#endif// WIDGET_H

mydelegate.cpp

#include"mydelegate.h"myDelegate::myDelegate(QObject*parent):QStyledItemDelegate(parent){}QWidget*myDelegate::createEditor(QWidget*parent,constQStyleOptionViewItem&option,constQModelIndex&index)const{Q_UNUSED(option);//只有第三列的item才使用qcombox进行编辑if(index.column()==3){QComboBox*box=newQComboBox(parent);box->addItems(QStringList()<<QStringLiteral("优")<<QStringLiteral("良")<<QStringLiteral("差"));returnbox;}returnnullptr;}voidmyDelegate::setEditorData(QWidget*editor,constQModelIndex&index)const{QString str=index.data(Qt::EditRole).toString();QComboBox*box=static_cast<QComboBox*>(editor);for(inti=0;i<box->count();i++){if(str==box->itemText(i)){box->setCurrentIndex(i);}}}voidmyDelegate::setModelData(QWidget*editor,QAbstractItemModel*model,constQModelIndex&index)const{QComboBox*box=static_cast<QComboBox*>(editor);model->setData(index,QVariant(box->currentText()),Qt::EditRole);}voidmyDelegate::updateEditorGeometry(QWidget*editor,constQStyleOptionViewItem&option,constQModelIndex&index)const{Q_UNUSED(index);editor->setGeometry(option.rect);}

mydelegate.h

#ifndefMYDELEGATE_H#defineMYDELEGATE_H#include<QObject>#include<QStyledItemDelegate>#include<QComboBox>classmyDelegate:publicQStyledItemDelegate{Q_OBJECTpublic:explicitmyDelegate(QObject*parent=nullptr);QWidget*createEditor(QWidget*parent,constQStyleOptionViewItem&option,constQModelIndex&index)constoverride;voidsetEditorData(QWidget*editor,constQModelIndex&index)constoverride;voidsetModelData(QWidget*editor,QAbstractItemModel*model,constQModelIndex&index)constoverride;voidupdateEditorGeometry(QWidget*editor,constQStyleOptionViewItem&option,constQModelIndex&index)constoverride;signals:publicslots:};#endif// MYDELEGATE_H

1.在重写 createEditor 函数时一定要指定combox的父亲,如果没有指定父亲那么combox将会以一个独立的窗口打开。
2. createEditor函数的理解。 原本的qstanditem你想用什么控件去代替它,如果保持原样那么就返回null
3. createEditor函数的理解。当你双击或者使用其它方式时(既想要编辑这个item时)。默认它应该显示什么数据
4. setModelData函数的理解。当你编辑完这个item时,想要修改对应model的数据为什么。
5. 自定义输入效果时不能,将item设置为不能编辑的状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 10:40:11

ESP32参考方案优先级排序:从芯片型号到认证约束的工程决策法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 10:39:39

IWR1642呼吸心跳数据集解析:从ADC原始数据到呼吸心率检测全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 10:39:20

AI芯片全栈软件地图:用Agent拆解UMD、KMD与编译器边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 10:38:10

从准予到开源:理解软件许可与合规实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 10:36:44

基于ROS的手势控制机械臂:从MediaPipe感知到舵机执行的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/31 10:35:12

AutoFlow零代码自动化:图像识别填表与录制回放实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华