欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 【Qt学习】| Qt事件之QEvent::ApplicationStateChange、QEvent::WindowActivate

【Qt学习】| Qt事件之QEvent::ApplicationStateChange、QEvent::WindowActivate

2025/7/3 10:22:09 来源:https://blog.csdn.net/fengqingdan/article/details/144273133  浏览:    关键词:【Qt学习】| Qt事件之QEvent::ApplicationStateChange、QEvent::WindowActivate

1.Event简介

QEvent::ApplicationStateChange 事件在应用程序的状态发生变化时触发。例如,当应用程序从前台切换到后台,或者从后台切换到前台时,会触发这个事件。这个事件通常用于处理应用程序级别的状态变化。
QEvent::WindowActivate 事件在窗口被激活时触发。当一个窗口从非活动状态变为活动状态时,会触发这个事件。这个事件通常用于处理窗口级别的状态变化。

2.触发顺序

当应用程序从后台切换到前台时,QEvent::ApplicationStateChangeQEvent::WindowActivate 事件的触发顺序通常是先触发 QEvent::ApplicationStateChange,然后再触发 QEvent::WindowActivate。这是因为应用程序的状态变化是一个全局事件,而窗口的激活是一个局部事件。
然而,我发现了一个有意思的现象:在QEvent::ApplicationStateChange 触发时判断窗口的活动状态isActiveWindow(),其结果在windows系统和Linux系统下有所不同,为此专门做了一个小实验。
实验操作:
最小化主窗口后,通过点击任务栏激活应用程序

实验代码:
MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QEvent>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:bool eventFilter(QObject *obj, QEvent *event) override;private:void handleApplicationStateChange();void handleWindowActivate();
};#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include <QApplication>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{// 安装事件过滤器qApp->installEventFilter(this);
}MainWindow::~MainWindow()
{
}bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{switch (event->type()) {case QEvent::ApplicationStateChange:handleApplicationStateChange();break;case QEvent::WindowActivate:handleWindowActivate();break;default:break;}return QMainWindow::eventFilter(obj, event);
}void MainWindow::handleApplicationStateChange()
{Qt::ApplicationState state = QGuiApplication::applicationState();if (state == Qt::ApplicationActive) {qDebug() << "ApplicationStateChange: Application is active";bool bActiveWindow = isActiveWindow();qDebug() << "ApplicationStateChange: isActiveWindow() =" << bActiveWindow;} else {qDebug() << "ApplicationStateChange: Application is not active";}
}void MainWindow::handleWindowActivate()
{qDebug() << "WindowActivate: Window is activated";bool bActiveWindow = isActiveWindow();qDebug() << "WindowActivate: isActiveWindow() =" << bActiveWindow;
}

实验结果:
1.windows系统输出的调试信息
在这里插入图片描述
2.linux系统下输出的调试信息
在这里插入图片描述
在windows系统下,isActiveWindow()的返回结果为true,而在linux系统下,isActiveWindow()的返回结果为false。

今天在开发过程中遇到了由该点差异引起的效果不一致的问题,在此记录一下。

qt知识持续更新中,如果对你有帮助的话可以点个赞啦~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词