qt实现窗口的动态切换

先说一下整体思路。页面布局两个widget然后再将定时器和按钮关联起来。

定时器发出信号的时候,随着信号,不断地重新设置widget的宽度,实现窗口的动态切换。

具体操作如下:

cpp 复制代码
class QtWidgetsApplication4 : public QMainWindow
{
    Q_OBJECT
    //切换的状态标志位
		enum class MoveActive
	{
		START,
		MOVING,
		FINISH
	};
public:
    QtWidgetsApplication4(QWidget *parent = Q_NULLPTR);
    //决定是否显示右边的widget
	void showWidget(bool isShow);

private:
    Ui::QtWidgetsApplication4Class ui;
	MoveActive m_status;
	bool showOrNot;
	QTimer * m_pTimer = nullptr;
};

具体函数实现如下

cpp 复制代码
void QtWidgetsApplication4::showWidget(bool isShow)
{
	showOrNot = isShow;
	m_status = MoveActive::START;
	m_pTimer->start(30);
}
cpp 复制代码
//首先设置一下窗口的尺寸
	int width = this->width();
	this->setFixedWidth(180);
	//初始状态只显示左边
	ui.widget_2->setFixedWidth(0);
	ui.widget_2->setVisible(false);
	ui.widget->setFixedWidth(195);
	ui.widget->setVisible(true);

	connect(ui.pushButton, &QPushButton::clicked, [&] {
		showWidget(true);
	});
	connect(ui.pushButton_2, &QPushButton::clicked, [&] {
		showWidget(false);
	});

	m_pTimer = new QTimer(this);
	connect(m_pTimer, &QTimer::timeout, [&] {
		switch (m_status)
		{
		case QtWidgetsApplication4::MoveActive::START:
			ui.widget->setVisible(true);
			ui.widget_2->setVisible(true);
			m_status = MoveActive::MOVING;
			break;
		case QtWidgetsApplication4::MoveActive::MOVING:
			if (showOrNot)
			{
				int leftWidth = ui.widget->width();
				leftWidth -= 10;
				int rightWidth = ui.widget_2->width();
				rightWidth += 10;
				if (rightWidth >= 175|| leftWidth <= 10)
				{
					rightWidth = 175;
					leftWidth = 0;
					ui.widget->setFixedWidth(0);
					ui.widget_2->setFixedWidth(175);
					m_status = MoveActive::FINISH;
					break;
				}
				ui.widget->setFixedWidth(leftWidth);
				ui.widget_2->setFixedWidth(rightWidth);
			}else {//左侧变宽,右侧变窄
				int leftWidth = ui.widget->width();
				int rightWidth = ui.widget_2->width();
				leftWidth += 10;
				rightWidth -= 10;
				if (leftWidth>=175|| rightWidth <= 10)
				{
					leftWidth = 175;
					rightWidth = 0;
					ui.widget->setFixedWidth(175);
					ui.widget_2->setFixedWidth(0);
					m_status = MoveActive::FINISH;
					break;
				}
				ui.widget->setFixedWidth(leftWidth);
				ui.widget_2->setFixedWidth(rightWidth);
			}
			break;
		case QtWidgetsApplication4::MoveActive::FINISH:
			m_pTimer->stop();
			break;
		default:
			break;
		}
	});

相关推荐
hoiii1876 分钟前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
炘爚37 分钟前
C++ 右值引用与程序优化
开发语言·c++
si莉亚1 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
良木生香1 小时前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
忘梓.1 小时前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u1 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海1 小时前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
cccccc语言我来了2 小时前
【C++---unordered_set/map底层封装】个不拘一格的集合。它不似有序集合那般循规蹈矩,而是以一种洒脱不羁的方式,将元素们随意地散落其中。每一个元素都是独一无二的。
开发语言·c++·哈希算法
Zfox_2 小时前
C++ IO流全解析:标准库中的数据处理与文件读写艺术
开发语言·c++