这是我在项目实战中的个人总结,写的仓促,有些东西也不一定准确,有些是自己推断的,还希望各位多多指教,多多评论。

关于QCombox如果不需要自定义,其实写UI是很简单的。

创建实例:QComboBox*  m_pMicrophoneCombox = new QComboBox;

我是用的QSS去的写样式,这里用了一个命名函数:m_pMicrophoneCombox->setObjectName("DeviceCombox");

如果是用的setstylesheet直接在代码里去写就好了。

下面说几个属性函数:

m_pMicrophoneCombox->setMaxVisibleItems(2);//最大可见区域为显示两条。

m_pMicrophoneCombox->setEditable(false); //设置QComboBox可编辑。

m_pMicrophoneCombox->setFocusPolicy(Qt::NoFocus);//设置QCombox没有焦点。

m_pMicrophoneCombox->setLineEdit(edit);//edit是一个lineedit,就是说QCombox的LineEdit可以自定义,而QT的源码中,顶端也是一个LineEdit。

m_pMicrophoneCombox->setCurrentIndex(0); // 设置当前选中的索引。

m_pMicrophoneCombox->setCurrentText(TR_TALK_DEVICE_COMBOX);//设置QCombox当前的显示text,我是用宏封装的,满足后期修改。

m_pMicrophoneCombox->setItemData(i, list[i]);//QCombox也可以自己传入一个链表,并且自己定义索引,当然,你想传一条数据,并且自己定义索引。

QListWidget* pListWidget = new QListWidget();//new一个widget的实例。

m_pMicrophoneCombox->setModel(pListWidget->model());//塞进widget的model。
m_pMicrophoneCombox->setView(pListWidget);//将widget装进Combox。

m_pMicrophoneCombox->count();//用来计算combox下拉窗体的大小。

m_pMicrophoneCombox->addItems(list);//插入一个列表。

m_pMicrophoneCombox->addItem("111");//插入单条数据。

以上函数基本满足业务要求,如果交互的样式比较复杂,要求自定义样式,这样的话,我们就要自己去写每一个item的样式。

分析下QCombox的源码,其实他的实现就是一个LineEdit和一个ListWidget,知道哦这个就可以自己去重新写一个ListWidget。

Item *pItem = new Item(); //item是自己自定义写的布局,每一个item的自定义样式就可以写在这个里面。
QListWidgetItem *pListWidgetItem = new QListWidgetItem(list[i],pListWidget);//我是将链表的数据塞进QCombox里。
pItem->setItemData(list[i]);//给每一个item塞进数据
pListWidget->setItemWidget(pListWidgetItem, pItem);//关于这个函数我的理解是:在底下一层上面再覆盖一层。

然后在QSS的样式里写hover、pressed鼠标事件,就有鼠标的交互。

这种办法虽然可行,但是数据不与UI分离,都搅在一团。

最佳的方案就是:

既然QT的combox支持listwidget,那么整体都用自己定制的listwidget。

在itemwidget里写布局,自己搞一个delegate,在代理去管理UI,数据在model里去操作,这里的model可能要自己封装一层,满足combox的交互要求。

pListWidget->m_pModel->Append(list[i]);//将每一个数据塞进model,剩下的数据操作就由model去管理。

特殊注意的是:这个时候,qt原生的那些接口都不生效了,例如:setcurrenttext还有setcurrentindex,查看源码发现都是根据索引来操控,而事实上,我们用自己的model

去管理的数据,并不会生成一个索引来满足combox管理的数据,所以这些对外的接口可能也要自己去封装出来,可以说基本上是放弃了combox,自己去组装LineEdit和ListWidget。

其实代码量是很多的,公司业务可以去封装成控件,方便开发。

最后,如果大神们有更好的办法,欢迎评论。

快速开发QCombox以及业务样式自定义的更多相关文章

  1. HFun.快速开发平台(五)=》自定义系统数据选择

    本篇介绍HFun.快速开发平台的另一项系统常用功能:系统数据或参数选择,主要应用在表单录入中信息的选择,如类别,编号等.先贴出本系统实现的页面效果: 如上图所示,系统中将参数的选择统一展现为该方式,开 ...

  2. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享

    由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ...

  3. HFun.快速开发平台(二)=》自定义列表实例(请求参数的处理)

    上编描述了自定义列表的基本实现功能,本此记录列表的请求过程. 个人比较喜欢对参数进行对象化,方便后续人维护及查看,先上代码: /************************************ ...

  4. HFun.快速开发平台(四)=》自定义列表实例(请求参数的处理)

    上编自定义列表描述了自定义列表的基本实现功能,本此记录列表的请求过程. 个人比较喜欢对参数进行对象化,方便后续人维护及查看,先上代码: /******************************* ...

  5. HFun.快速开发平台(二)=》自定义列表实例

    应用系统中数据列表的展现是开发内容之一,实现的方式基本是通过编号具体的访问列表页实现,通过检索条件进行数据源的获取,列字段的描述,还可能会有检索条件的实现,列表数据的导出等功能. 为了将重复工作进行简 ...

  6. SNF快速开发平台MVC-名片管理(实际名片样式)

    名片管理实际的做的意义在于演示应用,在这里使用的技术有排序控件,查询条件.自由样式瀑布流式分页等技术. 下面是自由样式效果图: 下面表格样式效果图: 具体操作: 新增名片 在新增时可以上传图像进行裁剪 ...

  7. (转载)Android快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup

    [置顶] [Android]快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup 标签: androidAdapter快速开发0耦合 2016-12-1 ...

  8. [原创]自定义view之:快速开发一款Material Design风格的dialog的开源项目MDDialog

    随着google开始主导Material Design风格的设计,越来越多的app开始使用Material Design风格来设计自己的UI.虽然在Android Studio中集成了多种快速开发框架 ...

  9. 如何提高码农产量,基于java的web快速开发平台之自定义表单开发随笔

    老板 :下班前一定写完? 程序猿:可以,下班前能一定给! 第二天早上上班~~~ 老板:这都第二天了,怎么没写完? 程序猿:我还没有下班呢! 哎!程序猿的痛啊 公司上线的项目有不少销售记录表,又是报价单 ...

随机推荐

  1. redhat 6 使用centos源 yum安装

    1.删除redhat原有的yum源 # rpm -aq | grep yum|xargs rpm -e --nodeps 2.下载新的yum安装包 这里我们使用CentOS的yum源 # wget h ...

  2. Java设计模式学习记录-策略模式

    策略模式 策略模式的定义是:定义了一系列的算法,把它们一个个的封装起来,并且使它们可相互替换,让算法可以独立于使用它的客户而变化. 设计原则是:把一个类中经常改变或者将来可能会经常改变的部分提取出来作 ...

  3. C#读取“我的文档”等特殊系统路径及环境变量

    返回“我的文档”路径字符串 Environment.GetFolderPath(Environment.SpecialFolder.Personal) 本技巧使用GetFolderPath方法来获取指 ...

  4. MarkdownPad编写博客技巧笔记

    说明 想约束自己使用博客来记录自己的内容,发现CSDN能导入.md文件,就查了查使用方式,发现确实比较好用的,本文档就是使用MarkdownPad编写,生成.md上传的.记录下使用方法 Markdow ...

  5. vb.net連接ACCESS数据库

    '導入命名空間Imports System.Data.OleDb '定義變量 Dim Sql As String 'OleDb連線 Dim SqlAC As OleDbConnection Dim C ...

  6. Android-加载图片避免OOM

    http://blog.csdn.net/guolin_blog/article/details/9316683 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有 ...

  7. WebKit的Platform接口部分

    转载请注明出处:http://www.cnblogs.com/fangkm/p/3787977.html WebKit中解析.渲染网页的过程中需要一些功能,比如: socket连接.URL资源请求的实 ...

  8. django项目一 分页器(前端分页和后端分页区别)

    1. 客户信息展示 1. 母版和继承 {% extends 'layout'%} {% load static%} {% static '文件路径' %} block css js content 2 ...

  9. 撩课-Web大前端每天5道面试题-Day1

    1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量: 2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到 ...

  10. Vue知识点(面试常见点)

    v-bind和v-model的区别 1.v-bind用来绑定数据和属性以及表达式,缩写为':' 2.v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 什么是 mvvm? MVV ...