Я интегрировал диалог Qt в традиционное приложение Win32 и теперь немного озадачен тем, как управлять событиями клавиатуры, распространяющимися из Qt-> Win32. Есть ли способ проверить, обрабатывает ли Qt события (например, ввод, идущий в поле редактирования), и предотвращать распространение этих событий на хост-приложение?
Приложение Win32 имеет собственную очень сложную систему ускорителей, и при работе с собственными редакторами обычно мы отключаем ускорители вручную. У меня нет возможности сделать это для диалога Qt, поскольку он является общим виджетом для нескольких приложений.
В настоящее время я отключаю ускорители хостов в диалоге в целом, получая фокус, но можно ли было сказать Qt, чтобы предотвратить распространение событий kbd из ящиков редактирования? В идеале, без изменения кода QtDialogs (хотя я могу сделать это при необходимости?)
Я понятия не имею, будет ли это на самом деле работать, но вы можете попробовать:
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-eventsystem или что-то в этом роде), а QApplication :: sendEvent () не распространяется сам по себе.
Я надеюсь, что это работает, удачи!
(ps. Этот код не был протестирован или скомпилирован)
Есть ли способ проверить, обрабатывает ли Qt события (например, ввод идет в поле редактирования)
На всякий случай, если вы еще не использовали его, вам обязательно стоит взглянуть на Spy ++ (входит в Visual Studio), которая позволяет отслеживать каждое сообщение.
Я не знаком с 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);
}
}