1. 程式人生 > >基於Qt的類似QQ好友列表抽屜效果的實現

基於Qt的類似QQ好友列表抽屜效果的實現

轉載地址: http://blog.csdn.net/shuideyidi/article/details/30619167

前段時間在忙畢業設計,所以一直沒有更新部落格。今天答辯完以後,將對我的畢業設計進行模組展示,供Qt初學者進行參考。

畢業設計題目:Linux系統下基於Qt的區域網即時通訊系統設計與實現

其中我有一個類似於QQ的好友列表,然後對好友可以進行分組管理,畢設中具體效果圖如下:

網上查尋到的設計思路:

缺點:(1):只能顯示某一組中的好友,不能同時顯示多個分組中好友列表;

            (2):必須顯示某一組中的好友,不能夠都隱藏。

2.採用QTreeView或者QListView的方式,個人感覺比較麻煩,所以一直沒喲嘗試過。之前也找過到一個部落格是採用這個方式的,但是由於本人的粗心,現在找不到了。。。

好了,介紹完別人的,接下來就是自己的了。

其實我的方法很簡單,就是利用QLayout 佈局以及 QWidget的setVisible()函式,控制顯示。

[cpp] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include <QVBoxLayout>
  2. #include <QLabel>
  3. class IMToolItem : public QWidget {  
  4.     Q_OBJECT  
  5. public:  
  6.     IMToolItem(const QString &title,  
  7.              QWidget *parent = 0) : QWidget(parent), layout(new
     QVBoxLayout)  
  8.     {  
  9.         layout = new QVBoxLayout;  
  10.         layout->setContentsMargins(0, 0, 0, 0);  
  11.         layout->addWidget(new QLabel(title));  
  12.         setLayout(layout);  
  13.         layout->setContentsMargins(0,0,0,0);  
  14.         layout->setSpacing(0);  
  15.     }  
  16.     void addItem(QWidget *item)  
  17.     {  
  18.         m_itemList.append(item);  
  19.         layout->addWidget(item);  
  20.         item->setVisible(false);  
  21.     }  
  22. protected:  
  23.     void mousePressEvent(QMouseEvent *event)  
  24.     {  
  25.         for (int i=0; i<m_itemList.size(); ++i)  
  26.         {  
  27.             m_itemList[i]->setVisible(!m_itemList[i]->isVisible());  
  28.         }  
  29.     }  
  30. private:  
  31.     QList<QWidget *> m_itemList;  
  32.     QVBoxLayout *layout;  
  33. };  
  34. class IMToolBox : public QWidget {  
  35.     Q_OBJECT  
  36. public:  
  37.     IMToolBox(QWidget *parent = 0) : QWidget(parent), layout(new QVBoxLayout)  
  38.     {  
  39.         setLayout(layout);  
  40.         layout->setContentsMargins(0,0,0,0);  
  41.         layout->setSpacing(0);  
  42.     }  
  43.     void addItem(IMToolItem *item)  
  44.     {  
  45.         layout->addWidget(item);  
  46.     }  
  47. private:  
  48.     QVBoxLayout *layout;  
  49. };  
#include <QVBoxLayout>
#include <QLabel>

class IMToolItem : public QWidget {
    Q_OBJECT
public:
    IMToolItem(const QString &title,
             QWidget *parent = 0) : QWidget(parent), layout(new QVBoxLayout)
    {
        layout = new QVBoxLayout;
        layout->setContentsMargins(0, 0, 0, 0);
        layout->addWidget(new QLabel(title));
        setLayout(layout);

        layout->setContentsMargins(0,0,0,0);
        layout->setSpacing(0);
    }

    void addItem(QWidget *item)
    {
        m_itemList.append(item);
        layout->addWidget(item);
        item->setVisible(false);
    }

protected:
    void mousePressEvent(QMouseEvent *event)
    {
        for (int i=0; i<m_itemList.size(); ++i)
        {
            m_itemList[i]->setVisible(!m_itemList[i]->isVisible());
        }
    }

private:
    QList<QWidget *> m_itemList;
    QVBoxLayout *layout;
};

class IMToolBox : public QWidget {
    Q_OBJECT
public:

    IMToolBox(QWidget *parent = 0) : QWidget(parent), layout(new QVBoxLayout)
    {
        setLayout(layout);
        layout->setContentsMargins(0,0,0,0);
        layout->setSpacing(0);
    }

    void addItem(IMToolItem *item)
    {
        layout->addWidget(item);
    }

private:
    QVBoxLayout *layout;
};


這段程式碼不僅可以實現QQ好友列表的抽屜效果,還能支援很多額外的拓展,。但是是為讀者提供一個思路,讀者可以自由擴充套件,封裝成自己的類,供自己使用。

如果只要顯示抽屜效果,IMToolItem這個類已經完全夠用。

改日我會上傳一個簡單的demo供大家參考,也希望大家對不足之處進行批評指導,大家一起分享交流,互相學習。

================================================================================================================================

昨天由於太晚了,所以沒有把demo提供給大家。

今天一大早起來,就將這個模組提取出來,寫成了一個簡單的demo供大家參考。

demo中效果圖:

介紹:

點選分組title,可以顯示或者隱藏整個分組內的好友;

當好友數量過多,操作顯示範圍,右側會出現滾動條。

還有要說的就是,我覺得對於QList<QWidget *> m_itemList的迴圈遍歷,來控制顯示隱藏不是很合理。

可以直接把顯示分組的標籤label放在IMToolBox,將好友按鈕放在IMToolItem中,然後直接控制IMToolItem的顯示或者隱藏,應該也可以的。