我有一个Windows Qt应用程序,它创建一个QMainWindow,解散(关闭和删除)它,然后创建一个新的QMainWindow。新的QMainWindow需要在系统中的“活动”窗口时进行一些设置,并且只要它不再是系统中的“活动”窗口,就需要进行一些拆卸。当我说'主动'是z顺序时我真正关心的是 - 我希望QMainWindow在桌面z顺序中最高时进行设置,并且当它不再是z-中最高时拆除顺序。
奇怪的是,当我通过QMainWindow :: isActiveWindow(),QApplication :: activeWindow()或QEvent检测到窗口激活时,Qt关于“活动”窗口的概念与z-order的概念不符。 :: WindowActivate,当窗口不是z顺序中的最高值时,它们并不总是返回负数。
我有一个演示此问题的示例程序。这很简单。
main.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();
}
mainwindow.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。