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

相关推荐
网络风云19 分钟前
golang中的包管理-下--详解
开发语言·后端·golang
小唐C++37 分钟前
C++小病毒-1.0勒索
开发语言·c++·vscode·python·算法·c#·编辑器
S-X-S42 分钟前
集成Sleuth实现链路追踪
java·开发语言·链路追踪
北 染 星 辰1 小时前
Python网络自动化运维---用户交互模块
开发语言·python·自动化
佳心饼干-1 小时前
数据结构-栈
开发语言·数据结构
我们的五年1 小时前
【C语言学习】:C语言补充:转义字符,<<,>>操作符,IDE
c语言·开发语言·后端·学习
灯火不休ᝰ1 小时前
[java] java基础-字符串篇
java·开发语言·string
励志去大厂的菜鸟2 小时前
系统相关类——java.lang.Math (三)(案例详细拆解小白友好)
java·服务器·开发语言·深度学习·学习方法
w(゚Д゚)w吓洗宝宝了2 小时前
单例模式 - 单例模式的实现与应用
开发语言·javascript·单例模式
siy23332 小时前
【c语言日寄】Vs调试——新手向
c语言·开发语言·学习·算法