VS2017+QT实现折叠/展开布局功能

1.预实现功能

学习Qt已经有一小段时间了,但是发现做过的东西总是会忘记,所以打算不定时写几篇博文,算记录自己的学习过程,也算和大家分享一下经验,也希望大家指正错误,相互学习。

1.1功能分析

应最近项目需求,需要使用Qt实现一个折叠和展开布局的功能,具体功能类似于PPT等主流软件DockWidget中项目的布局样式,通过点击按钮来控制布局的展开和折叠。
在这里插入图片描述
起初,打算使用Qt自带的QToolBox来实现这一功能,但实际结果并不能符合预期要求,ToolBox会默认展开一组不能完全折叠,而且会改变布局,看起来十分突兀,具体效果参见博文QToolBox实现QQ好友列表功能
然后,打算借以往项目经验,使用删除和重建布局的方式来伪实现折叠和展开效果,发现效果并不理想,并且会导致布局中的数据在向主窗口进行信号发送和连接时很容易报错。
最后,发现借助QWidget类本身自带的方法setVisible(bool),就可以实现想要的功能,参考博文用Qt实现QQ好友列表界面伸缩功能

2.功能实现

2.1LockerButton

LockerButton.h

/*
* @file                 LockerButton.h
* @brief                抽屉式Widget控件显隐按钮
* @auther               Tree
* @version              0.0
* @date                 2019.12.31
* @copyright
*/

#ifndef LOCKER_BUTTON_H
#define LOCKER_BUTTON_H

#include <QWidget>
#include <QPushButton>

class QLabel;

class LockerButton : public QPushButton
{
   
    Q_OBJECT
public:
    /// @brief 构造方法
    explicit LockerButton(QWidget* parent = nullptr);

    /// @brief SetImageLabel
    /// 设置按钮图标
    void SetImageLabel(const QPixmap &pixmap);

    /// @brief SetTextLabel
    /// 设置按钮文字
    void SetTextLabel(QString text);

    /// @brief GetImageHandle
    /// 返回m_imageLabel
    QLabel* GetImageHandle();

    /// @brief GetImageHandle
    /// 返回m_textLabel
    QLabel* GetTextHandle();

private:
    // 按钮图标
    QLabel* m_imageLabel;
    // 按钮文字
    QLabel* m_textLabel;
};

#endif // LOCKER_BUTTON_H

LockerButton.cpp

#include "LockerButton.h"

#include <QLabel>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QDoubleValidator>

LockerButton::LockerButton(QWidget* parent)
    : QPushButton(parent)
{
   
    m_imageLabel = new QLabel;
    m_imageLabel->setFixedWidth(20);
    m_imageLabel->setScaledContents(true);
    m_imageLabel->setStyleSheet("QLabel{background-color:transparent;}");

    m_textLabel = new QLabel;
    m_textLabel->setStyleSheet("QLabel{background-color:transparent;}");

    QHBoxLayout* mainLayout = new QHBoxLayout;
    mainLayout->addWidget(m_imageLabel);
    mainLayout->addWidget
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值