2

我有一个包含一些行编辑的 QWidget。当 Line 编辑获得焦点时,我必须弹出一个新的 Numpad 小部件。当我单击 Numpad 小部件时,焦点必须保留在 Line 编辑小部件中。所以我尝试使用

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 小部件时,LineEdit 小部件上有闪烁(标题栏闪烁效果)。所以谁能告诉我我必须使用哪个宏来阻止小部件在触摸屏上的焦点。

我尝试使用WM_Touch宏,这导致没有正确的输出。请帮忙……</p>

4

2 回答 2

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;
}

请建议我哪里出错了。

编辑:

当我尝试下面的代码时,它解决了问题,但现在它不适用于鼠标点击。但是,我希望小部件能够同时处理触摸和鼠标点击。所以谁能告诉我用于处理触摸和鼠标点击的宏。

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显示小部件当前处于非活动状态)。

于 2014-09-22T07:28:18.907 回答
0

您需要检查WM_GESTURE消息。同样来自这篇好文章:

注意默认情况下,您会收到 WM_GESTURE 消息而不是 WM_TOUCH 消息。如果您调用 RegisterTouchWindow,您将停止接收 WM_GESTURE 消息。

因此,如果您仍想接收 WM_TOUCH 而不是 WM_GESTURE,则可以获取 Qt 窗口的 HWnd 并将其传递给 RegisterTouchWindow 调用。

于 2014-09-22T06:40:08.463 回答