• 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()添加所有的分组。这样,我们就可以和他们聊天啦^_^。

  • 相关阅读:
    场景调研
    12.8
    12.7
    12.6
    12.5
    12.4
    12.3
    重启oracle数据库的操作方法
    oracle创建dblink方法
    SQL*Loader 详解
  • 原文地址:https://www.cnblogs.com/invisible2/p/6843135.html
Copyright © 2020-2023  润新知