我有一个包含一些行编辑的QWidget。当线编辑获得焦点时,我必须弹出一个新的Numpad小部件。当我单击Numpad小部件时,焦点必须保留在Line edit小部件中。所以我尝试使用
bool NumPadWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
if(eventType == "windows_generic_MSG")
{
const MSG *msg = reinterpret_cast<MSG *>(message);
if(msg->message == WM_MOUSEACTIVATE)
{
*result = MA_NOACTIVATE;
return true;
}
}
#endif
return false;
}
这适用于numpad小部件的鼠标点击,但我使用的是触摸屏。当我触摸Numpad小部件时,LineEdit小部件上会出现闪烁(标题栏闪烁效果)。所以任何人都可以告诉我,我必须使用哪个宏来阻止小部件在触摸屏上的焦点。
我尝试使用 WM_Touch 宏,导致没有正确的输出。请帮忙......
答案 0 :(得分:1)
感谢您N1ghtLight
的回复。我尝试使用WM_GESTURE
消息。它接受触摸输入,但焦点问题(LineEdit
窗口小部件的标题栏显示不活动)仍然存在。这是我的代码。
bool NumPadWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
if(eventType == "windows_generic_MSG")
{
const MSG *msg = reinterpret_cast<MSG *>(message);
if(msg->message == WM_MOUSEACTIVATE || msg->message == WM_GESTURE)
{
*result = MA_NOACTIVATE;
return true;
}
}
#endif
return false;
}
请建议我哪里出错了。
修改强>
当我尝试以下代码时,它解决了问题,但现在它不适用于鼠标点击。但是,我希望小部件能够同时处理Touch和鼠标点击。那么任何人都可以告诉我用于处理触摸和鼠标点击的宏。
bool NumPadWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
if(eventType == "windows_generic_MSG")
{
const MSG *msg = reinterpret_cast<MSG *>(message);
if(msg->message == WM_MOUSEACTIVATE)
{
*result = MA_NOACTIVATEANDEAT;;
return true;
}
}
#endif
return false;
}
从文档中,
MA_ACTIVATE
激活窗口,不丢弃鼠标消息。
MA_ACTIVATEANDEAT
激活窗口,并丢弃鼠标消息。
MA_NOACTIVATE
不激活窗口,也不放弃鼠标消息。
MA_NOACTIVATEANDEAT
不激活窗口,但丢弃鼠标消息。
当我尝试使用MA_NOACTIVATE
时,焦点问题(LineEdit
窗口小部件TitleBar
显示窗口小部件当前处于非活动状态)存在。
答案 1 :(得分:0)
您需要检查WM_GESTURE消息。 同样来自this好文章:
注意默认情况下,您会收到WM_GESTURE消息而不是WM_TOUCH消息 消息。如果您致电RegisterTouchWindow,您将停止接收 WM_GESTURE消息。
因此,如果您仍想接收WM_TOUCH而不是WM_GESTURE,您可以获取Qt窗口的HWnd并将其传递给RegisterTouchWindow调用。