Когда активное окно QMainWindow действительно неактивно?

3

У меня есть приложение Windows Qt, которое создает QMainWindow, отклоняет (закрывает и удаляет) его, а затем создает новый QMainWindow. Новый QMainWindow должен выполнять некоторую настройку всякий раз, когда он является "активным" окном в системе, и ему нужно сделать несколько разрывов, когда он больше не является "активным" окном в системе. То, что меня действительно волнует, когда я говорю "активный", - это z-порядок. Я хочу, чтобы QMainWindow выполнял настройку, когда он был самым высоким в z-порядке на рабочем столе, и сбрасывание, когда оно больше не является самым высоким в z- порядок.


Любопытно, что понятие Qt о том, что такое "активное" окно, не соответствует концепции z-порядка - когда я обнаруживаю активацию окна через QMainWindow:: isActiveWindow(), QApplication:: activeWindow() или QEvent:: 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!

... хотя это явно не активное окно в системе - блокнот.


Что здесь происходит? Я вижу это с Qt 4.8.4 и 5.1.0 в Windows.


enter image description here

спросил(а) 2013-11-05T22:29:00+04:00 6 лет назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема