zoukankan      html  css  js  c++  java
  • 基于Qt的相似QQ好友列表抽屉效果的实现

    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/shuideyidi/article/details/30619167

    前段时间在忙毕业设计,所以一直没有更新博客。今天答辩完以后,将对我的毕业设计进行模块展示,供Qt刚開始学习的人进行參考。

    毕业设计题目:Linux系统下基于Qt的局域网即时通信系统设计与实现

    当中我有一个相似于QQ的好友列表,然后对好友能够进行分组管理,毕设中详细效果图例如以下:

    网上查寻到的设计思路:

    1.採用QToolBox的方式,尽管看起来有点样子,可是并非我们所熟悉的好友列表,比方:http://blog.csdn.net/qianguozheng/article/details/6719074

    缺点:(1):仅仅能显示某一组中的好友,不能同一时候显示多个分组中好友列表。

                (2):必须显示某一组中的好友,不能够都隐藏。

    2.採用QTreeView或者QListView的方式,个人感觉比較麻烦,所以一直没哟尝试过。之前也找过到一个博客是採用这个方式的,可是因为本人的粗心,如今找不到了。。

    好了,介绍完别人的,接下来就是自己的了。

    事实上我的方法非常easy。就是利用QLayout 布局以及 QWidget的setVisible()函数,控制显示。

    #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,将好友button放在IMToolItem中,然后直接控制IMToolItem的显示或者隐藏,应该也能够的。

    下载链接:http://download.csdn.net/detail/shuideyidi/7496831

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10661415.html
Copyright © 2011-2022 走看看