這是我在項目實戰中的個人總結,寫的倉促,有些東西也不一定准確,有些是自己推斷的,還希望各位多多指教,多多評論。 關於QCombox如果不需要自定義,其實寫UI是很簡單的。 創建實例:QComboBox* m_pMicrophoneCombox = new QComboBox; 我是用的QSS去的寫樣 ...
這是我在項目實戰中的個人總結,寫的倉促,有些東西也不一定准確,有些是自己推斷的,還希望各位多多指教,多多評論。
關於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。
其實代碼量是很多的,公司業務可以去封裝成控制項,方便開發。
最後,如果大神們有更好的辦法,歡迎評論。