3

我有一个 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 看到了这一点。

在此处输入图像描述

4

0 回答 0