欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)

程序员文章站 2022-06-30 11:47:18
...

本文主要总结用Qt的自定义按钮和QWidget界面实现QQ好友列表的界面伸展和收缩功能,以及鼠标滑过、鼠标单击的QSS样式表效果。全文分为两大部分,分别是原理讲解和效果实现。

用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)
抽缩界面效果图

 

源代码下载地址:(已经上传,过审后贴上来!)

 

一、原理讲解

实现QQ好友列表伸缩或者抽屉效果,不是像QToolbox那样的效果,其实很简单。只需要用垂直布局将按钮和QWidget控件布局到一起,然后通过QWidget::setVisible(bool)实现QWidget界面的显示和隐藏就行。其中自定义按钮的原理讲解可以参考博主这篇博客:https://blog.csdn.net/naibozhuan3744/article/details/102536188

 

二、示例代码

2.1新建一个Widget工程,勾选UI界面,然后新建一个类QFriendListBtn,同时添加两个图片资源文件;

2.2分别向qqqfriendlistbtn.h、qqqfriendlistbtn.cpp、widget.h、widget.cpp、main.cp添加如下代码

qqqfriendlistbtn.h

#ifndef QQQFRIENDLISTBTN_H
#define QQQFRIENDLISTBTN_H

#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QPixmap>
#include <QHBoxLayout>

class QFriendListBtn : public QPushButton
{
public:
    explicit QFriendListBtn(QWidget *parent = nullptr);
    void setImageLbl(const QPixmap &pixmap);
    void setTextLbl(QString text);
    QLabel *getImageHandle();
    QLabel *getTextHandle();

private:
    QLabel *imageLbl;
    QLabel *textLbl;
};

class QQQFriendList : public QWidget
{
    Q_OBJECT
public:
    explicit QQQFriendList(QWidget *parent = nullptr);



    void setupUI();

private:
    QFriendListBtn *friendBtn1;
    QFriendListBtn *friendBtn2;
    QWidget *friendWdg1;
    QWidget *friendWdg2;
    quint8 friendList1;
    quint8 friendList2;

signals:

public slots:
};

#endif // QQQFRIENDLISTBTN_H

 

qqqfriendlistbtn.cpp

#include "qqqfriendlistbtn.h"

#include <QVBoxLayout>
#include <QDebug>


QFriendListBtn::QFriendListBtn(QWidget *parent) : QPushButton(parent)
{
    imageLbl=new QLabel;
    imageLbl->setFixedWidth(20);
    imageLbl->setScaledContents(true);
    imageLbl->setStyleSheet(QString("QLabel{background-color:transparent;}"));
    textLbl=new QLabel;
    textLbl->setStyleSheet("QLabel{background-color:transparent;}");
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addWidget(imageLbl);
    mainLayout->addWidget(textLbl);
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    this->setLayout(mainLayout);
}

void QFriendListBtn::setImageLbl(const QPixmap &pixmap)
{
    imageLbl->setPixmap(pixmap);
}

void QFriendListBtn::setTextLbl(QString text)
{
    textLbl->setText(text);
}

QLabel *QFriendListBtn::getImageHandle()
{
    return imageLbl;
}

QLabel *QFriendListBtn::getTextHandle()
{
    return textLbl;
}

QQQFriendList::QQQFriendList(QWidget *parent) : QWidget(parent),friendList1(0),friendList2(0)
{
    setupUI();
}

void QQQFriendList::setupUI()
{
    this->resize(300,600);
    friendBtn1=new QFriendListBtn;
    friendBtn1->setObjectName("QFriendListBtn");
    friendBtn1->setTextLbl("好友列表1");
    friendBtn1->setImageLbl(QPixmap(":/resource/icon/向右箭头1.jpg"));
    friendBtn1->setStyleSheet("#QFriendListBtn{background-color:blue}"
                              "#QFriendListBtn:hover{background-color:rgba(250,50,50,0.4)}"
                              "#QFriendListBtn:pressed{background-color:rgba(50,250,50,0.4)}");
    QLabel *friendLbl1=friendBtn1->getTextHandle();
    friendLbl1->setStyleSheet("QLabel{color:rgba(255,255,255,1)}"); //设置按钮文本框字体颜色
    friendBtn2=new QFriendListBtn;
    friendBtn2->setTextLbl("好友列表2");
    friendBtn2->setImageLbl(QPixmap(":/resource/icon/向右箭头1.jpg"));
    friendWdg1=new QWidget;
    friendWdg1->setParent(this);
    friendWdg1->setFixedHeight(100);
    friendWdg1->setVisible(false);  //屏蔽好友列表1界面
    friendWdg1->setStyleSheet("QWidget{background-color:red}");
    friendWdg2=new QWidget;
    friendWdg2->setParent(this);
    friendWdg2->setFixedHeight(100);
    friendWdg2->setVisible(false);  //屏蔽好友列表2面
    friendWdg2->setStyleSheet("QWidget{background-color:green}");

    QVBoxLayout *vlayout=new QVBoxLayout;
    vlayout->addWidget(friendBtn1);
    vlayout->addWidget(friendWdg1);
    vlayout->addWidget(friendBtn2);
    vlayout->addWidget(friendWdg2);
    vlayout->addStretch();
    vlayout->setMargin(0);
    vlayout->setSpacing(0);
    this->setLayout(vlayout);

    connect(friendBtn1,&QFriendListBtn::clicked,[this](bool){
        if(friendList1%2)
        {
            friendBtn1->setImageLbl(QPixmap(":/resource/icon/向右箭头1.jpg"));
            friendWdg1->setVisible(false);    //friendList1偶数屏蔽好友列表界面,奇数显示好友列表界面
        }else
        {
            friendBtn1->setImageLbl(QPixmap(":/resource/icon/向下箭头.jpg"));
            friendWdg1->setVisible(true);
        }
        friendList1++;qDebug()<<"单击按钮1";});
    connect(friendBtn2,&QFriendListBtn::clicked,[this](bool){
        if(friendList2%2)
        {
            friendBtn2->setImageLbl(QPixmap(":/resource/icon/向右箭头1.jpg"));
            friendWdg2->setVisible(false);
        }
        else
        {
            friendBtn2->setImageLbl(QPixmap(":/resource/icon/向下箭头.jpg"));
            friendWdg2->setVisible(true);
        }
        friendList2++;});
}

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

 

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "qqqfriendlistbtn.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QQQFriendList *qqFriendList=new QQQFriendList(nullptr);
    qqFriendList->setWindowModality(Qt::WindowModal);
    qqFriendList->show();
}

 

main.cp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

2.3程序运行效果图如下所示

用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)
抽缩界面效果图

 

 

参考内容:

https://blog.csdn.net/qq_31281189/article/details/51957364(参考:好友列表伸缩功能)