这是我在项目实战中的个人总结,写的仓促,有些东西也不一定准确,有些是自己推断的,还希望各位多多指教,多多评论。
关于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。
其实代码量是很多的,公司业务可以去封装成控件,方便开发。
最后,如果大神们有更好的办法,欢迎评论。