QT 創建一個具有復選功能的下拉列表控件


最近研究了好多東西,前兩天突然想做一個具有復選功能的下拉列表框。然后在網上“學習”了很久之后,終於發現了一個可以用的,特地發出來記錄一下。

 

一、第一步肯定是先創建一個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


免責聲明!

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



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