zoukankan      html  css  js  c++  java
  • 快速开发QCombox以及业务样式自定义

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

     关于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。

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

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

  • 相关阅读:
    8.9乘船问题
    8.8几个背包问题
    8.7贪心策略例题:字典序最小问题
    8.6贪心策略例题:区间覆盖问题
    8.5贪心策略例题:区间选点问题
    8.4贪心策略例题:区间调度问题
    SQL 报表 生成月份临时表
    CentOS8 .NET Core项目部署
    Django with database on SQL Server
    SQL 父子表,显示表中每条记录所在层级
  • 原文地址:https://www.cnblogs.com/132818Creator/p/8185382.html
Copyright © 2011-2022 走看看