У меня есть приложение 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.
Задача ещё не решена.
Других решений пока нет …