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

相关推荐
天若有情6738 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
特种加菲猫8 小时前
继承,一场跨越时空的对话
开发语言·c++
玩转单片机与嵌入式9 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
茉莉玫瑰花茶10 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
张健115640964811 小时前
临界区和同一线程上锁
java·开发语言·jvm
头发够用的程序员11 小时前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
夜猫逐梦12 小时前
【逆向经验】一篇文章讲透为什么CE搜不到Python游戏的内存值
开发语言·python·游戏
SilentSamsara12 小时前
闭包的本质:Python 如何捕获自由变量
开发语言·python·青少年编程·pycharm