栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QT笔记——折叠框

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QT笔记——折叠框

我们想要实现一个折叠框,通过点击按钮隐藏其他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
![在这里插入图片描述](https://img-blog.csdnimg.cn/17b2f24074174630beaf539f126fe5fe.png
第一:我们先展示 基本的折叠功能,运行结果图,就是下面的widget中没有任何的控件,这是没有任何问题的


第二:我们在widget中添加一些控件,但是不布局,就是很随意的摆放,这个也是正常的

第三:我们在widget中添加一些布局的控件,展开是没有问题的,但是缩放出现了问题
这是布局好的UI图

缩放 出问题图:

解决方案

//在需要展示的时候展示出来,不需要展示的时候我们就隐藏下面的widget
ui.widget_down->hide();
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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010443.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号