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

2023-11-13

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

抽缩界面效果图

 

源代码下载地址:https://download.csdn.net/download/naibozhuan3744/11860177

 

一、原理讲解

实现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程序运行效果图如下所示

抽缩界面效果图

 

 

参考内容:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 反转 PyQtGraph 中的 Y 轴

    我正在使用 Python 和 PyQt4 开发一个应用程序 该应用程序根据深度绘制不同的参数 绘图包是 PyQtGraph 因为它具有良好的动画速度特性 由于我正在根据深度进行绘图 因此我想反转 Y 轴 我发现我可以修改PyQtGraph文
  • 如何在子进程期间和之后执行操作

    我有一个调用子程序的程序 当子程序使用 Popen 运行时 我需要禁用运行按钮并启用停止按钮 但是 由于Popen打开了一个新进程 因此程序完成后应该打印的内容会立即打印出来 我尝试添加self p communicate after Po
  • 将 Objective-C 代码转换为 C++ 以检测 OS X 上的用户空闲时间

    我正在开发 Qt C 应用程序 我需要简单的函数来在 Mac OS X 上以秒为单位检索用户空闲时间 我发现这个代码用于检测用户空闲时间 include
  • 具有最简单学习曲线的 C++ GUI 构建选项是什么 - VS/Qt/wxWidgets/等等?

    我希望能够尽可能快速 轻松地构建 GUI 应用程序 我有能力 虽然不是专家 也没有接受过正式的培训 C 但从未使用过 GUI 构建工具包或框架或任何东西 我不是专业程序员 在构建 GUI 应用程序方面完全没有经验且无知 花了几个小时研究试图
  • 如何在 Qt 中使用 QTabWidget 创建多行选项卡?

    我尝试使用 QTabWidget 创建一个多行选项卡 如下所示 我也设置了tabPosition 南但我不能有多行选项卡 因为所有选项卡都是水平的 所有选项卡都在一行中 而不是多行 这些是我得到的标签 我读过了这个帖子 https stac
  • 如何在 QML 中使用 Font Awesome

    有谁知道如何在 QML 中使用 Font Awesome 吗 我找不到任何文档或任何信息如何在 QML 中使用 Font Awesome 我喜欢做的是使用fontello http fontello com 创建最小的图标集 而不是从 Fo
  • 我可以取消选中组框中的一组 RadioBottom 吗?

    组 Box 内的单选底部将被视为一组底部 它们是互斥的 我怎样才能清理他们的检查状态 我有几件收音机底部 其中一件经过检查 我怎样才能 清洁 取消选中 所有收音机底部 setChecked 在组内不起作用 我尝试做以下事情但失败了 我的代码
  • 单击旁边的按钮时如何引用动态创建的标签 [Qt]

    每次按下 添加客户端 按钮时 减号按钮 客户端名称 客户端计数器和加号按钮都会以水平线添加到网格布局中 我想在按下加号 减号按钮时更新计数 QLabel 这是我的代码 include widget h include ui widget h
  • 迁移到 Qt6/PyQt6:Qt5 中所有已弃用的短格式名称是什么?

    我正在尝试从以下位置迁移代码库PyQt5 to PyQt6 我读过这篇文章 参见https www pythonguis com faq pyqt5 vs pyqt6 https www pythonguis com faq pyqt5 v
  • QT布局,如何使水平布局中的小部件向下移动一行而不是溢出窗口

    现在我有一个 QHBoxLayout W W W W W W 我将尺寸调整得更小 得到 W W W W lt gt 我想要 下划线是黑色空间 W W W W W W 我不确定哪种布局可以做到这一点 有人有主意吗 KDE 设置应用程序可以满足
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 如何设置 QTableView 中特定单元格的线条样式?

    我正在使用 QT GUI 我正在使用 QTableView 实现一个简单的十六进制编辑控件 我最初的想法是使用一个有十七列的表格 表的每一行都有 16 个十六进制字节 然后在第十七列中显示该数据的 ASCII 表示形式 理想情况下 我想编辑
  • Qt3D 是 Qt5 的一部分吗?

    我在windows中安装了Qt5库 但Qt助手中没有关于Qt3D的文档 Qt3D 是 Qt5 的一部分还是已从发布版本 5 中删除 是的 Qt 3D 成为标准 Qt 库Qt 5 7 发布 http blog qt io blog 2016
  • 选择文件夹后 QFileDialog::getExistingDirectory 不关闭

    In Qt QFileDialog dlg new QFileDialog QDir dir dlg gt getExistingDirectory this tr Choose folder qgetenv HOME 打开文件夹选择对话框
  • qmake 和 QT_INSTALL_PREFIX。如何为 Qt 库选择新位置?

    我是 qmake 的新手 我正在尝试构建一个现有的应用程序 Qt 最初安装在 usr local lib Qt 4 3 5 中 qmake query QT INSTALL PREFIX 返回该路径 我已将 Qt 库移动到另一个位置 生成的
  • 在QT中以不同的时间间隔更新GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何在QT中以不同的时间间隔更新GUI 最好的是我可以控制时间间隔 我知道 QTimer 可以在同一时间间隔更新 GUI 但我
  • QML 适合所有分辨率的屏幕

    大家好 我的 QML 代码有问题 我犯了一个错误 我给元素设置了一定的大小 现在我在将应用程序放在其他设备上时遇到了问题 我会将我的代码粘贴到有宽度和高度的位置 以便您可以更改它以向我展示如何使用动态调整大小 我需要说我正在使用以下代码从
  • 无法锚定到不是父级或同级 QML QtQuick 的项目

    我正在使用 QML 开发 python 桌面应用程序 我的 QML 文件中有这个 SplitView anchors fill parent orientation Qt Horizontal Rectangle color 272822
  • 如何删除在设计器模式下创建的插槽?

    我已经创建了按钮cancelButton 然后我创建了函数槽on cancelButton clicked 使用上下文菜单项Go to slot 但是 过了一段时间 我删除了这个按钮 不再需要 并尝试删除该函数 但编译器给出错误undefi
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的

随机推荐

  • 销售心理学

    销售中的心理学 影响你一生的销售心理学书籍 要想钓到鱼 就要像鱼一样思考 在生活中 如果想钓到鱼 你就得像鱼那样思考 而不是像渔夫那样思考 当你对鱼了解得越多 你也就越来越会钓鱼了 这样的想法用在销售中同样适用 要知道 销售的过程其实就是销
  • 【Redis17】Redis进阶:管道

    Redis进阶 管道 管道是啥 我们做开发的同学们经常会在 Linux 环境中用到管道命令 比如 ps ef grep php 在之前学习 Laravel框架时的 Laravel6 4 管道过滤器https mp weixin qq com
  • Latex使用

    问题 在使用latex的过程中插入图片 在某些条件下 图片可能会出现越过后续的文字出现在下一页的页首 解决办法 在该tex文件首部加上 usepackage stfloats 然后参数设置成H如下 begin figure H center
  • 使用frp 实现内网穿透 & 将私人电脑变成一个服务器

    使用frp 实现内网穿透 frp 是什么 frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 https 应用协议提供了额外的能力 且尝试性支持了点对点穿透 作用 比如你需要用到云服务器部署你的
  • 阅读GFS论文

    GFS论文发表距今已经十几年了 据之开源的hdfs也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅
  • Neon Instruction C支持的向量运算

    转载请标明出处 https blog csdn net u013752202 article details 92008843 文章目的 快速索引到需要的向量运算 vadd gt ri ai bi 1 Vector add 正常指令 r a
  • pagehelper使用方法及参数说明

    pagehelper使用方法及参数说明 使用方法 Override public PageInfo
  • spring源码--10--IOC高级特性--autowiring实现原理

    spring源码 10 IOC高级特性 autowiring实现原理 1 Spring IoC容器提供了2种方式 管理Bean的依赖关系 1 1 显式管理 通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理 1 2
  • vue学习笔记:在vscode中使用@提示路径

    在vscode中输入 后如果可以智能提示路径 可以有效防止路径名称输入错误 减少不必要的麻烦 效果如下图所示 安装 Path Autocomplete 插件后可以实现路径的智能提示 步骤如下 1 在vscode中查找Path Autocom
  • 关于shell运行python文件中的错误——shell脚本换行

    问题 https ask csdn net questions 7900411 spm 1001 2014 3001 5505 问题由来 由于工程需要在本地window中写 当需要比较少的算力时在本地跑 当需要比较大的算力时就需要在auto
  • K8S调用GPU资源配置指南

    06 09 K8S调用GPU资源配置指南 时间 版本号 修改描述 修改人 2022年6月9日15 33 12 V0 1 新建K8S调用GPU资源配置指南 编写了Nvidia驱动安装过程 2022年6月10日11 16 52 V0 2 添加K
  • 基于pytorch的手势识别

    本次实验主要是使用pytorch完成手势识别 网络包含两个隐藏层 第一层隐藏层有576个节点 第二层隐藏层有144个节点 输入784个节点 图片大小为28 28 输出10个节点 10种手势 目录 1 数据集处理 2 神经网络的建立 3 神经
  • 利用ajax添加到购物车代码,Woocommerce添加到购物车链接Ajax在其他帖子或页面中启用...

    要在自定义添加到购物车按钮中启用ajax 至少有3种方法 A simple HTML Ajax add to cart link Add to cart Using Woocommerce existing add to cart id 1
  • Axios 入门教程

    Axios Get Post 别名方式 Get Post Axios 引入 axios 的 js 文件 使用 axios 发送请求 并获取响应结果axios method get url then function resp alert r
  • 【NOIP2012】开车旅行(倍增)

    题面 Description 小A 和小B决定利用假期外出旅行 他们将想去的城市从1到N 编号 且编号较小的城市在编号较大的城市的西边 已知各个城市的海拔高度互不相同 记城市 i的海拔高度为Hi 城市 i 和城市 j 之间的距离 d i j
  • var、let、const的区别

    var let const的区别 大体区别 const定义的变量不可以修改 而且必须初始化 var定义的变量可以修改 如果不初始化会输出undefined 不会报错 var定义的变量没有块的概念 可以跨酷爱访问 不能跨函数访问 let是块级
  • 【华为OD机试真题】投篮大赛(C++&java&python)100%通过率 超详细代码注释 代码优化

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 投篮大赛 知识点字符串 时间限制 1s空间限制 256MB限定语言 不限 题目描述 你现在是
  • dbnet训练_1215

    https blog csdn net hhhhhhhhhhwwwwwwwwww article details 123904386 ops request misc 257B 2522request 255Fid 2522 253A 25
  • java使用jdbc操作数据库

    一 概述 为了持久化 方便管理数据 出现了mysql sqlserver等多种数据库 我们可以直接这些数据库中使用sql语言增删改查管理数据 但是对于业务人员来说不懂sql 没法通过sql直接在数据库操作 所以我们要通过程序提供对数据库的操
  • 用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)

    本文主要总结用Qt的自定义按钮和QWidget界面实现QQ好友列表的界面伸展和收缩功能 以及鼠标滑过 鼠标单击的QSS样式表效果 全文分为两大部分 分别是原理讲解和效果实现 抽缩界面效果图 源代码下载地址 https download cs