什么时候活动的QMainWindow窗口不是真的有效?

时间:2013-11-05 19:29:41

标签: c++ qt focus qwidget qmainwindow

我有一个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。

enter image description here

0 个答案:

没有答案