基於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?- #include <QVBoxLayout>
- #include <QLabel>
- class IMToolItem : public QWidget {
- Q_OBJECT
- public:
- IMToolItem(const QString &title,
- QWidget *parent = 0) : QWidget(parent), layout(new
- {
- 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;
- };
#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的顯示或者隱藏,應該也可以的。