快速開發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。

其實代碼量是很多的,公司業務可以去封裝成控件,方便開發。

    最后,如果大神們有更好的辦法,歡迎評論。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM