我们想要实现一个折叠框,通过点击按钮隐藏其他widget或者控件,参考他人的,但是遇到了很多问题,然后记录下来
第一种方式:
Widget .h
#pragma once #include#include "ui_Widget.h" #include #include #include #include #include #include "WidgetFirst.h" class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = Q_NULLPTR); ~Widget(); void addWidget(QWidget* widget); //widget的布局layout中添加widget void setDownHeight(const int& downHeight); //设置展示的高度 void setDurationTime(const int& TimeMS = 10); //设置时间 void setPicturePath(const QString& uppath,const QString& downpath); //设置图片路径 private slots: void slotShowWidget(); private: Ui::Widget ui; WidgetFirst first; QList m_listPicturePath; //图片路径 int m_widgetUpHeight; //展示上面的高度(ui中 上面widget的最小大小 不建议修改,不提供接口) int m_widgetdownHeight; //展示下面的高度 int m_durationTime; //持续时间 bool m_showWidget; //是否显示了下半部分窗口 };
Widget .cpp
#include "Widget.h"
Widget::Widget(QWidget* parent)
: QWidget(parent), m_showWidget(false), m_durationTime(10)
{
ui.setupUi(this);
addWidget(&first);
m_listPicturePath.clear();
m_widgetUpHeight = ui.widget_up->height();
this->setFixedHeight(m_widgetUpHeight); //初始展示的widget的界面高度(相当于设置下半部分窗口隐藏)
setDurationTime(10);
setDownHeight(300);
ui.widget_down->hide();
setPicturePath(":/image/1.png", ":/image/2.png");
connect(ui.btnScale, &QPushButton::clicked, this, &Widget::slotShowWidget);
}
Widget::~Widget()
{
}
void Widget::addWidget(QWidget* widget)
{
ui.verticalLayout->addWidget(widget);
}
void Widget::setDownHeight(const int& downHeight)
{
m_widgetdownHeight = downHeight;
}
void Widget::setDurationTime(const int& TimeMS)
{
m_durationTime = TimeMS;
}
void Widget::setPicturePath(const QString& uppath,const QString & downpath)
{
m_listPicturePath.clear();
m_listPicturePath.push_back(downpath);
m_listPicturePath.push_back(uppath);
}
void Widget::slotShowWidget()
{
QPropertyAnimation* animation = new QPropertyAnimation(this, ""); //qt动画类
animation->setDuration(m_durationTime); //动画持续时间
if (!m_showWidget)
{
ui.widget_down->show();
ui.btnScale->setIcon(QIcon(m_listPicturePath.at(0)));
animation->setStartValue(m_widgetUpHeight);//动画开始值和结束值
animation->setEndValue(m_widgetdownHeight);
connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value) {
this->setFixedHeight(value.toInt());
});
animation->start(QAbstractAnimation::DeleteWhenStopped);
m_showWidget= true;
}
else
{
ui.widget_down->hide();
ui.btnScale->setIcon(QIcon(m_listPicturePath.at(1)));
animation->setStartValue(m_widgetdownHeight);
animation->setEndValue(m_widgetUpHeight);
connect(animation, &QPropertyAnimation::valueChanged, [this](const QVariant& value) {
this->setFixedHeight(value.toInt());
});
//动画停止时 自动删除
animation->start(QAbstractAnimation::DeleteWhenStopped);
m_showWidget= false;
}
}
这是Widget界面,有颜色是为了区分辨别 是上面的widget 还是 下面的widget
另外准备的一个界面ui,我叫WidgetFirst
; ui.widget_down->show();
第二种方式:
主要利用layout的属性 即函数 setSizeConstraint(QLayout::SetFixedSize);
第一个widget属性:
原始图:
折叠图:
代码我们直接 widget->hide()就可以实现效果了
这样我们可以点击缩放按钮,然后在隐藏掉下面的widget,而且 上面的widget位置也不会变动
参考链接:
https://blog.csdn.net/weixin_42224004/article/details/117913318
https://blog.csdn.net/weixin_41761608/article/details/124731795



