最近研究了好多東西,前兩天突然想做一個具有復選功能的下拉列表框。然后在網上“學習”了很久之后,終於發現了一個可以用的,特地發出來記錄一下。
一、第一步肯定是先創建一個PROJECT了,這里對工 PROJECT的類型沒有太大的要求,QMainWindow、QWidget、QDialog都是沒關系的。
二、這里需要添加我們的代碼了。這里我們用CCheckCombox來命名把,添加新文件:CCheckCombox.h和對應的CCheckCombox.cpp。
CCheckCombox.h的文件代碼如下:
1 #ifndef CCHECKCOMBOX_H 2 #define CCHECKCOMBOX_H 3 4 #include <QComboBox> 5 #include <QMouseEvent> 6 #include <QAbstractItemView> 7 #include <QItemSelectionModel> 8 9 class CCheckCombox : public QComboBox 10 { 11 Q_OBJECT 12 public: 13 explicit CCheckCombox(QWidget *parent = 0); 14 15 //添加下拉框內容 16 void appendItem(const QString &text, bool bChecked); 17 18 //QComboBox的虛函數用來隱藏列表框,當單擊是復選框時不讓隱藏,用來改變狀態 19 void hidePopup(); 20 21 protected: 22 void mousePressEvent(QMouseEvent *event); 23 24 private: 25 //更新更改項的狀態 26 void updateIndexStatus(int index); 27 28 signals: 29 //狀態改變后發送一個信號,告訴外界。 30 void checkedStateChange(int index, bool bChecked); 31 32 public slots: 33 34 }; 35 36 #endif // CCHECKCOMBOX_H
然后是我們的CCheckCom.cpp的代碼:
1 #include "ccheckcombox.h" 2 3 CCheckCombox::CCheckCombox(QWidget *parent) : 4 QComboBox(parent) 5 { 6 7 } 8 9 void CCheckCombox::appendItem(const QString &text, bool bChecked) 10 { 11 QIcon icon; 12 if( bChecked ) 13 { 14 icon.addFile(":/Image/check.png"); 15 } 16 else 17 { 18 icon.addFile(":/Image/uncheck.png"); 19 } 20 21 addItem(icon, text, bChecked); 22 } 23 24 void CCheckCombox::updateIndexStatus(int index) 25 { 26 bool bChecked = this->itemData(index).toBool(); 27 28 if( bChecked ) 29 { 30 this->setItemIcon(index, QIcon(":/Image/uncheck.png")); 31 } 32 else 33 { 34 this->setItemIcon(index, QIcon(":/Image/check.png")); 35 } 36 37 setItemData(index, !bChecked); 38 39 emit checkedStateChange(index, !bChecked); 40 } 41 42 void CCheckCombox::mousePressEvent(QMouseEvent *event) 43 { 44 int x = event->pos().x(); 45 46 int iconWidth = this->iconSize().width(); 47 48 if( x <= iconWidth ) 49 { 50 int index = this->currentIndex(); 51 52 updateIndexStatus(index); 53 } 54 else 55 { 56 QComboBox::mousePressEvent(event); 57 } 58 } 59 60 void CCheckCombox::hidePopup() 61 { 62 int iconWidth = this->iconSize().width(); 63 64 int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x(); 65 66 int index = view()->selectionModel()->currentIndex().row(); 67 68 if( x >= 0 && x <= iconWidth ) 69 { 70 updateIndexStatus(index); 71 } 72 else 73 { 74 QComboBox::hidePopup(); 75 } 76 }
值得注意的是,這里我們的選中和為選種采用了圖片來確定。所以我們還需要通過截圖來獲得一個對勾選中和一個為選中圖片。
然后我們的這個時候需要從ui中托一個Combobox控件到窗口上。
之后我們需要把這個Combobox控件提升為一個CCheckCombox的類:
右鍵單擊控件選擇提升為,之后填入相應的信息。
第一步輸入類名稱,然后點擊添加,第三步需要點擊添加后的類名稱選中。然后點擊提升類。
到這里,我們的CCheckCombox已經成功提升了,接下來就是添加里邊的item了。
我這里構造了一個ADD方法來添加測試item,大家使用的時候直接調用appendItem()方法就可以直接添加,第一個參數為text,第二個參數為默認選中狀態。
然后我們測試一下,看行不行。。。。。。
item是成功添加了,但是還沒有復選框,原因在於,我們剛才說到,這里的選中狀態是由圖片來控制的,所以我們要帶入資源文件。
添加成功過之后我們再來測試一下。
好的,到這里,我們的控件已經可以使用了,后期我們如果要取出這些選中的內容的話,只需要使用itemData(i).toBool()方法來判斷就行了。
下面是本文用到的代碼相關文件。CCheckCombox的兩個文件來自網絡,不記得是哪位大佬發的了,在這里特別感謝。
下載地址:https://git.coding.net/HULANG-BTB/QT_CCheckCombox.git