首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理Win32应用程序和QWinMigrate之间的键盘事件

管理Win32应用程序和QWinMigrate之间的键盘事件
EN

Stack Overflow用户
提问于 2015-12-15 22:04:53
回答 2查看 339关注 0票数 4

我已经将Qt对话框集成到传统的Win32应用程序中,现在我有点困惑于如何管理从Qt->Win32 32传播的键盘事件。有没有任何方法测试Qt是否‘处理’事件(例如,输入到一个编辑框),并防止这些事件传播到主机应用程序?

Win32应用程序有自己非常复杂的加速器系统,当使用本机编辑器时,我们通常手动禁用加速器。我没有能力为Qt对话框这样做,因为它是多个应用程序之间的共享小部件。

目前,我禁用了对话框上的主机加速器作为一个整体来获得焦点,但是是否有可能告诉Qt以防止kbd事件从编辑框中传播?理想情况下,不需要修改QtDialogs代码(虽然我可以在必要时这样做?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-20 18:27:27

我不知道这是否有效,但你可以试一试:

代码语言:javascript
复制
class KeyEventPropagetionPreventer: public QObject
{
public:
    KeyEventPropagetionPreventer( QWidget * widget ) 
    : QObject( widget ), widget( widget ), instercept_events( true )
    {
        widget->installEventFilter( this )
    }

    bool eventFilter(QObject *obj, QEvent *event)
    {
        if ( intercept_events && event->type() == QEvent::KeyPress) // or other types if needed
        {
            intercept_events = false; // prevents eating your own events
            QKeyEvent new_event( *event ); // Might be that you need to implement your own copying function if the copyconstructor is disabled
            QApplication::sendEvent(this->widget, &new_event);
            instercept_events = true;
            return true;
        } 
        else 
        {
            return QObject::eventFilter(obj, event);
        }
    }

private:
    QWidget * widget;
    bool instercept_events;
}

然后添加这一行,在其中创建对话框:

代码语言:javascript
复制
new KeyEventPropagetionPreventer( your_qt_dialog ); // will be deleted by the Qt parent/child system when the dialog is deleted.

其想法是拦截所有键盘事件,但也创建一个副本,并将其发送到小部件。希望拦截器实际上阻止了事件的传播(而不是qt或其他什么的),QApplication::sendEvent()本身也不会传播。

我希望这能成功,祝你好运!

(ps. )此代码尚未测试或编译)

票数 3
EN

Stack Overflow用户

发布于 2015-12-25 03:04:49

有没有办法测试Qt是否在“处理”事件(例如,输入到一个编辑框)

如果您还没有使用它,那么一定要查看Spy++ (包含在Visual中),它使您能够跟踪每一条消息。

我不熟悉Qt,但是如果您想要捕获Win32中的所有消息,可以使用GetMessage(),例如:

代码语言:javascript
复制
BOOL bRet;

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else  // you could do whatever you want with the message before it is dispatched
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34300298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档