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