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

相关推荐
走在考研路上7 分钟前
Python错误处理
开发语言·python
数据小爬虫@17 分钟前
Python爬虫:如何优雅地“偷窥”商品详情
开发语言·爬虫·python
CV大法好19 分钟前
刘铁猛p3 C# 控制台程序引用System.Windows.Forms报错,无法引用程序集 解决方法
开发语言·c#
Days205030 分钟前
uniapp小程序增加加载功能
开发语言·前端·javascript
朱小勇本勇1 小时前
Qt实现控件拖曳
开发语言·数据库·qt
片片叶1 小时前
C++(十四)
开发语言·c++
dengjiayue1 小时前
golang实现简单的reids服务2
开发语言·golang
疯狂的沙粒2 小时前
JavaScript 单例模式的创建与应用
开发语言·前端·javascript·vue.js
余额不足121382 小时前
C语言基础六:循环结构及面试上机题
c语言·开发语言
m0_748256562 小时前
Rust环境安装配置
开发语言·后端·rust