我已经将Qt对话框集成到传统的Win32应用程序中,现在我有点困惑于如何管理从Qt->Win32 32传播的键盘事件。有没有任何方法测试Qt是否‘处理’事件(例如,输入到一个编辑框),并防止这些事件传播到主机应用程序?
Win32应用程序有自己非常复杂的加速器系统,当使用本机编辑器时,我们通常手动禁用加速器。我没有能力为Qt对话框这样做,因为它是多个应用程序之间的共享小部件。
目前,我禁用了对话框上的主机加速器作为一个整体来获得焦点,但是是否有可能告诉Qt以防止kbd事件从编辑框中传播?理想情况下,不需要修改QtDialogs代码(虽然我可以在必要时这样做?)
发布于 2015-12-20 18:27:27
我不知道这是否有效,但你可以试一试:
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;
}然后添加这一行,在其中创建对话框:
new KeyEventPropagetionPreventer( your_qt_dialog ); // will be deleted by the Qt parent/child system when the dialog is deleted.其想法是拦截所有键盘事件,但也创建一个副本,并将其发送到小部件。希望拦截器实际上阻止了事件的传播(而不是qt或其他什么的),QApplication::sendEvent()本身也不会传播。
我希望这能成功,祝你好运!
(ps. )此代码尚未测试或编译)
发布于 2015-12-25 03:04:49
有没有办法测试Qt是否在“处理”事件(例如,输入到一个编辑框)
如果您还没有使用它,那么一定要查看Spy++ (包含在Visual中),它使您能够跟踪每一条消息。
我不熟悉Qt,但是如果您想要捕获Win32中的所有消息,可以使用GetMessage(),例如:
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);
}
}https://stackoverflow.com/questions/34300298
复制相似问题