我有一个 Windows Qt 应用程序,它创建一个 QMainWindow,关闭(关闭并删除)它,然后创建一个新的 QMainWindow。新的 QMainWindow 只要是系统中的“活动”窗口就需要进行一些设置,并且只要它不再是系统中的“活动”窗口,就需要进行一些拆卸。当我说“活动”是 z 顺序时,我真正关心的是 - 我希望 QMainWindow 在它在桌面 z 顺序中最高时进行设置,并在它不再是 z 中最高时进行拆卸 -命令。
奇怪的是,Qt 关于“活动”窗口的概念与 z 顺序的概念不一致——当我通过 QMainWindow::isActiveWindow()、QApplication::activeWindow() 或 QEvent::WindowActivate 检测到窗口激活时,当窗口不是 z 顺序最高时,它们并不总是返回负数。
我有一个演示这个问题的示例程序。这很简单。
主.cpp:
#include "mainwindow.h"
#include <QApplication>
#include <QThread>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
for ( int i = 10; i >= 0; --i )
{
QThread::sleep( 1 );
qDebug( "%d...", i );
}
w.show();
return a.exec();
}
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_textEdit = new QTextEdit( this );
setCentralWidget( m_textEdit );
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::event(QEvent *e)
{
switch ( e->type() )
{
case QEvent::WindowActivate:
qDebug( "WindowActivate - I %s the active window!", qApp->activeWindow() == this ? "AM" : "AM NOT" );
break;
case QEvent::WindowDeactivate:
qDebug( "WindowDeactivate" );
break;
default: break;
}
return QMainWindow::event(e) ;
}
ui_mainwindow.h 与 QtCreator 使用默认 Qt 应用程序模板为您制作的版本没有变化。
在 QtCreator 中构建并运行这个程序。它会从 10 开始倒计时,然后显示 QMainWindow。如果你在倒计时时不做任何事情,QMainWindow 将出现在 QtCreator 上方,在 QtCreator 的控制台上你会看到:
3...
2...
1...
0... WindowActivate - I AM the active window!
但是,如果在倒计时期间,您单击另一个窗口(可能是记事本实例),将焦点从 QtCreator 移开,QMainWindow 将出现,但它不会是 z 顺序中的最高值 - 记事本将是. 但是,QMainWindow 的窗口装饰将突出显示(?!?),就好像它是活动窗口一样,在控制台上我们得到
3...
2...
1...
0... WindowActivate - I AM the active window!
...即使它显然不是系统中的活动窗口 - 记事本是。
这里发生了什么?我在 Windows 上使用 Qt 4.8.4 和 5.1.0 看到了这一点。