Qt实现 QQ好友列表QToolBox
简述
QToolBox类提供了一个列(选项卡式的)部件条目。
QToolBox可以在一个tab列上显示另外一个,并且当前的item显示在当前的tab下面。每个tab都在tab列中有一个索引位置。tab的item是一个QWidget 。
详细描述
每个item都有一个itemText()、一个可选的itemIcon()、一个可选的itemToolTip()、和一个widget()函数 。item的属性可以通过setItemText()、setItemIcon()、和setItemToolTip()来改变,并且每个item可以通过setItemEnabled()单独设置为是否可用。
Item的添加使用addItem(),或通过insertItem()在特定位置插入。如果要获取items的总数,可以调用count()函数。Item可以使用removeItem()从toolbox中删除。结合removeItem()和insertItem(),允许你将item移动到不同的位置。
当前item部件的索引由currentIndex()返回,并使用setCurrentIndex()来设置。一个特定item的索引可以使用indexOf()来获取,item()则返回给定索引的item。
当前的item发生变化时,会发射currentChanged()信号。
使用
玩穿越,谁不会呀!O(∩_∩)O哈哈~
梦回经典,创建一个金庸老先生的武侠传。主要分为三组:大美女、大英雄、大恶人。
人物属性:会员、名字、图像、个人说明。
古代人其实也蛮拼的,办会员,好让别人更了解TA、关注TA。。。
效果
源码
#include <QToolBox>
#include <QGroupBox>
#include <QLabel>
#include <QHBoxLayout>
class ToolBox : public QToolBox
{
    Q_OBJECT                                    //只有加入了Q_OBJECT,你才能使用QT中的signal和slot机制
public:
    ToolBox(QWidget *parent = 0)
        : QToolBox(parent)
    {
        initUI();                                     //初始化UI
        // 连接信号槽
        connect(this, &QToolBox::currentChanged, this, &ToolBox::onCurrentChanged);
    }
private:
    void initUI() {
        struct User {
            bool bVIP;  // 会员
            QString strName;  // 名字
            QString strIcon;  // 图像
            QString strDesc;  // 个人说明
        } user[3][5] =
        {
            {
                {true, QStringLiteral("香香公主"), ":/QQ/1", QStringLiteral("金庸笔下的第一美女")},
                {true, QStringLiteral("小龙女"), ":/QQ/2", QStringLiteral("玉女心经")},
                {true, QStringLiteral("王语嫣"), ":/QQ/3", QStringLiteral("熟读各派武学秘笈")},
                {false, QStringLiteral("赵敏"), ":/QQ/4", QStringLiteral("大元第一美人")},
                {false, QStringLiteral("周芷若"), ":/QQ/5", QStringLiteral("光复汉家河山,光大峨嵋")}
            },
            {
                {true, QStringLiteral("萧峰"), ":/QQ/6", QStringLiteral("丐帮帮主 - 智勇双全、胆略过人、豪迈飒爽")},
                {true, QStringLiteral("令狐冲"), ":/QQ/8", QStringLiteral("独孤九剑")},
                {true, QStringLiteral("杨过"), ":/QQ/9", QStringLiteral("黯然销魂掌")},
                {false, QStringLiteral("郭靖"), ":/QQ/7", QStringLiteral("降龙十八掌")},
                {false, QStringLiteral("胡一刀"), ":/QQ/10", QStringLiteral("辽东大侠")}
            },
            {
                {true, QStringLiteral("金轮法王"), ":/QQ/11", QStringLiteral("龙象般若功")},
                {true, QStringLiteral("丁春秋"), ":/QQ/13", QStringLiteral("星宿老仙,法力无边")},
                {false, QStringLiteral("裘千仞"), ":/QQ/12", QStringLiteral("铁掌水上飘")},
                {false, QStringLiteral("成昆"), ":/QQ/14", QStringLiteral("混元霹雳手")},
                {false, QStringLiteral("李莫愁"), ":/QQ/15", QStringLiteral("冰魄银针,杀人如麻")}
            }
        };
        QStringList groupList;
        groupList << QStringLiteral("大美女") << QStringLiteral("大英雄") << QStringLiteral("大恶人");
        // 初始化列表
        for (int i = 0; i < sizeof(user)/sizeof(user[0]); i++)
        {
            QGroupBox *pGroupBox = new QGroupBox(this);
            QVBoxLayout *pLayout = new QVBoxLayout(pGroupBox);
            // 添加好友
            for (int j = 0; j < sizeof(user[0])/sizeof(user[0][0]); ++j)
            {
                QWidget *pWidget = initWidget(user[i][j].bVIP, user[i][j].strName,
                                              user[i][j].strIcon, user[i][j].strDesc);
                pLayout->addWidget(pWidget);
            }
            pLayout->addStretch();
            pLayout->setSpacing(10);
            pLayout->setContentsMargins(10, 10, 10, 10);
            // 添加分组
            addItem(pGroupBox, groupList.at(i));
        }
    }
    QWidget* initWidget(bool bVIP, const QString &name,
                        const QString &icon, const QString &desc = "") {
        QWidget *pWidget = new QWidget(this);
        QLabel *pPixmapLabel = new QLabel(this);
        QLabel *pNameLabel = new QLabel(this);
        QLabel *pDescLabel = new QLabel(this);
        // 图像 名称 描述
        pPixmapLabel->setPixmap(QPixmap(icon));
        pNameLabel->setText(name);
        pDescLabel->setText(desc);
        // VIP名字为红色;否则,白色
        pNameLabel->setStyleSheet(QString("color: %1;").arg(bVIP ? "rgb(240, 30, 40)" : "white"));
        pDescLabel->setStyleSheet("color: gray;");
        QVBoxLayout *pVLayout = new QVBoxLayout();
        pVLayout->addStretch();
        pVLayout->addWidget(pNameLabel);
        pVLayout->addWidget(pDescLabel);
        pVLayout->addStretch();
        pVLayout->setSpacing(5);
        pVLayout->setContentsMargins(0, 0, 0, 0);
        QHBoxLayout *pHLayout = new QHBoxLayout();
        pHLayout->addWidget(pPixmapLabel);
        pHLayout->addLayout(pVLayout);
        pHLayout->addStretch();
        pHLayout->setContentsMargins(0, 0, 0, 0);
        pWidget->setLayout(pHLayout);
        return pWidget;
    }
private slots:
    void onCurrentChanged(int index) {
        QString strGroup = itemText(index);
        qDebug() << strGroup;
    }
};
这里,我们建立了一个3行5列的二维数组,用来存储人物信息。
对于type array[A][B]形式的二维数组,可以通过计算sizeof获取行、列数。其中:
- sizeof(array[0][0]):为一个元素占用的空间,
 - sizeof(array[0]):为一行元素占用的空间,
 - sizeof(array):为整个数组占用的空间,
 
那么,很容易计算出行、列数:
- 行数 = sizeof(array)/sizeof(array[0]);
 - 列数 = sizeof(array[0])/sizeof(array[0][0]);
 
为了创建人物信息,我们定义了一个initWidget()函数,主要实现是创建了三个标签,分别用来显示图像、名字、个人说明。
创建完人物之后,再将他们添加至QGroupBox分组中。最后,通过addItem()添加所有的分组。这样,我们就可以和他们聊天啦^_^。
Qt实现 QQ好友列表QToolBox的更多相关文章
- 基于Qt的相似QQ好友列表抽屉效果的实现
		
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shuideyidi/article/details/30619167 前段时间在忙毕业设计, ...
 - iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)
		
iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...
 - [iOS基础控件 - 6.9.3] QQ好友列表Demo TableView
		
A.需求 1.使用plist数据,展示类似QQ好友列表的分组.组内成员显示缩进功能 2.组名使用Header,展示箭头图标.组名.组内人数和上线人数 3.点击组名,伸展.缩回好友组 code so ...
 - 仿QQ好友列表界面的实现
		
TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style ...
 - ExpandableListView仿QQ好友列表
		
本例中,对ExpandableListView中的数据进行了封装,分为两个JavaBean,一个为Group类表示组信息,一个Child类表示该组下子列表信息: Group: public class ...
 - (二十七)QQ好友列表的实现
		
QQ好友列表通过plist读取,plist的结构为一组字典,每个字典内有本组的信息和另外一组字典代表好友. 要读取plist,选择合适的数据结构,例如NSArray,然后调用initWithConte ...
 - android 实现QQ好友列表
		
在某些Android开发群里,看到有些新手问怎么实现QQ好友列表,其实网上一搜挺多的.接触Android,也才一年的时间,大部分时间花在工作上(解bug...),界面上开发很少参与.自己维护的系统应用 ...
 - swift 实现QQ好友列表功能
		
最近项目中有类似QQ好友列表功能,整理了一下,话不多说,直接上代码 import UIKit class QQFriend: NSObject { var name: String? var intr ...
 - Windows UIA自动化测试框架学习--获取qq好友列表
		
前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation, ...
 
随机推荐
- 国产手机插入mac os 系统中无法被识别的解决方法
			
一些国产手机插入mac os 系统中无法被识别,在命令行输入 system_profiler SPUSBDataType在, 然后将魅蓝note的vendor id 添加至 ~/.android/ad ...
 - 解决VMware安装Ubuntu的过程中窗口过小无法看到按钮的问题
			
最近在用VMware安装Ubuntu的时候,发现竟然只能看到部分界面,鼠标拖拽也没有用,就是看不到完整的界面,那要我怎么按下一步啊~(真是哭笑不得%>_<%),或者按TAB键,靠自己的想象 ...
 - JVM常用工具使用之jmap
			
一.参考链接 https://www.cnblogs.com/yjd_hycf_space/p/7753847.html 二.个人的总结 一般我习惯使用 jmap -dump:live,format= ...
 - calloc(), malloc(), realloc(), free(),alloca()
			
内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. 利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提 ...
 - C语言位操作初步
			
位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作. 位操作允许程序员设置.清除.测试与其他的操作,这些操作如下表: 操作 含义 & 按位与 | 按 ...
 - 23种设计模式之状态模式(State)
			
状态模式是一种对象的行为型模式,允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.状态模式封装了状态的转换过程,但是它需要枚举可能的状态,因此,需要事先确定状态种类,这也导致在状 ...
 - [转]Shell脚本之无限循环的两种方法
			
方法一: while循环,用的比较多的 #!/bin/bash set j= while true do let "j=j+1" echo "----------j is ...
 - Java虚拟机九 java.lang.String在虚拟机中的实现
			
在Java中,Java的设计者对String对象进行了大量的优化,主要有三个特点: 1.不变性: 不变性是指String对象一旦生成,则不能再对它进行改变.String的这个特点可以泛化成不变(imm ...
 - linux 安装Swagger(swagger-editor , swagger-ui)
			
一.环境要求 1.Nodejs ( 版本6.0x以上 ) 2.npm (npm 3.x) 注: linux 更新nodejs到最新 node -v 4.2.1 sudo npm cache clean ...
 - Java工程师之SpringBoot系列教程前言&目录
			
前言 与时俱进是每一个程序员都应该有的意识,当一个Java程序员在当代步遍布的时候,你就行该想到我能多学点什么.可观的是后端的框架是稳定的,它们能够维持更久的时间在应用中,而不用担心技术的更新换代.但 ...