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

关于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. jemalloc总结

    jemalloc支持SMP系统和并发多线程,多线程的支持是依赖于多个'arenas',并且一个线程第一次调用内存mallocer,与其相关联的是一个特殊的arena. 线程分配arena只有三种可能的 ...

  2. SpringMVC源码阅读入门

    1.导入 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中.正式的名称“Spring Web MVC”来自于它的源模块(spring-w ...

  3. CSS设置table下tbody滚动条与thead对齐的方法

    <style>table tbody {display:block;height:195px;overflow-y:scroll;} table thead, tbody tr {disp ...

  4. css中添加屏幕自适应方法(rem)

    css中添加屏幕自适应方法(rem) 只需要在公共css文件中添加下面代码:设计稿以750px,基础字体为20px为例,兼容性高,使用过程中px转化为rem即可 /*竖屏*/ @media scree ...

  5. 树莓派安装.net core 2.1

    0.更新源 sudo apt-get update 1.安装依赖 sudo apt-get install curl libunwind8 gettext 2.下载 SDK 或者 RunTime ht ...

  6. c#中Socket网络通信的入门

    请访问 http://balabiu.com/?p=16 后续本文更新将在这里: 将设计服务器端异步接受客户端连接和客户端消息.

  7. MVC初级教程(三)

      演示产品源码下载地址:http://www.jinhusns.com/Products/Download 

  8. 你得学会并且学得会的Socket编程基础知识

    这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblog ...

  9. c# 控制台应用程序批量修改文件夹下的后缀名(包括子文件夹)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  10. [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程

    通过实现Runnable接口创建线程 获取Thread对象,new出来,构造函数参数:Runnable对象 Runnable是一个接口,定义一个类MyRunnable实现Runnable接口,实现ru ...