1.Event简介
QEvent::ApplicationStateChange
事件在应用程序的状态发生变化时触发。例如,当应用程序从前台切换到后台,或者从后台切换到前台时,会触发这个事件。这个事件通常用于处理应用程序级别的状态变化。
QEvent::WindowActivate
事件在窗口被激活时触发。当一个窗口从非活动状态变为活动状态时,会触发这个事件。这个事件通常用于处理窗口级别的状态变化。
2.触发顺序
当应用程序从后台切换到前台时,QEvent::ApplicationStateChange
和 QEvent::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知识持续更新中,如果对你有帮助的话可以点个赞啦~