将小部件聚焦在触摸屏中的问题

时间:2014-09-20 14:22:43

标签: qt widget touch msdn qt5.2

我有一个包含一些行编辑的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 宏,导致没有正确的输出。请帮忙......

2 个答案:

答案 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调用。