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;
		}
	});

相关推荐
badhope1 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园2 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈2 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl2 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628883 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手3 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星3 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
sunwenjian8863 小时前
Java进阶——IO 流
java·开发语言·python
波特率1152003 小时前
const关键字与函数的重载
开发语言·c++·函数重载
FL16238631293 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#