Обрабатывать событие Flash-окна - PullRequest
0 голосов
/ 30 октября 2018

В Windows, когда родительское (главное) окно блокируется каким-либо модальным диалогом, нажатие на главное окно вызывает мигание диалогового окна. Такое поведение по умолчанию для ОС Windows. Насколько я понимаю, вручную это можно сделать с помощью функции WinApi FlashWindow или Qt's QApplication::alert.

Есть ли способ обработать это событие в модальном диалоге? В частности, я хотел бы добавить некоторые дополнительные действия в диалог. Меня интересует решение Qt-way, но также присваивается WinApi-way. Попытка обработать события с помощью QObject::eventFilter ничего не дает, когда диалоговое окно мигает.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

На основании ответа Сергея Кулиша я использовал перегрузку функции nativeEvent, но для класса диалогового окна (не для основного окна):

#include <windows.h>

bool MyDialog::nativeEvent(const QByteArray&, void* message, long*)
{
    const auto msg = static_cast<MSG*>(message);

    if (msg->message == WM_NCACTIVATE)
    {
        if (msg->wParam == TRUE) { ... } // dialog become active while blinking
        else { ... } // dialog become inactive while blinking
    }

    return false;
}

Мигание окна в Windows реализовано в виде серии WM_NCACTIVATE сообщений с wParam, установленным на FALSE и TRUE.

0 голосов
/ 30 октября 2018

Вам нужно объединить Qwidget :: nativeEvent с проверкой модального диалога QApplication :: activeModalWidget

Например, проверьте кнопку мыши в родительском окне модального окна.

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
   MSG* msg = static_cast<MSG*>(message);
   if (msg->message == WM_SETCURSOR) {
       QWidget* w = qApp->activeModalWidget();
       if (w) {
           WORD mouseMsg = (msg->lParam >> 16);
           if (mouseMsg == WM_LBUTTONDOWN) {
               qDebug() << "Click outside";
           }
       }
   }
   return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...