在Windows上,当父(主)窗口被任何模式对话框阻止时,单击主窗口将产生对话框闪烁。对于Windows操作系统,默认情况下会出现这种情况。据我了解,这可以通过WinApi的FlashWindow
函数或Qt的QApplication::alert
手动实现。
是否可以在模式对话框中处理此事件?特别是我想向对话框添加一些额外的操作。我对Qt-way解决方案感兴趣,但是WinApi-way也适用。对话框闪烁时,尝试通过QObject::eventFilter
处理事件不会产生任何事件。
答案 0 :(得分:2)
您需要结合使用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;
}
答案 1 :(得分:1)
基于Serhiy Kulish的answer,我使用了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
。