Управление событиями клавиатуры между приложением Win32 и QWinMigrate

Я интегрировал диалог Qt в традиционное приложение Win32 и теперь немного озадачен тем, как управлять событиями клавиатуры, распространяющимися из Qt-> Win32. Есть ли способ проверить, обрабатывает ли Qt события (например, ввод, идущий в поле редактирования), и предотвращать распространение этих событий на хост-приложение?

Приложение Win32 имеет собственную очень сложную систему ускорителей, и при работе с собственными редакторами обычно мы отключаем ускорители вручную. У меня нет возможности сделать это для диалога Qt, поскольку он является общим виджетом для нескольких приложений.

В настоящее время я отключаю ускорители хостов в диалоге в целом, получая фокус, но можно ли было сказать Qt, чтобы предотвратить распространение событий kbd из ящиков редактирования? В идеале, без изменения кода QtDialogs (хотя я могу сделать это при необходимости?)

4

Решение

Я понятия не имею, будет ли это на самом деле работать, но вы можете попробовать:

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. Этот код не был протестирован или скомпилирован)

3

Другие решения

Есть ли способ проверить, обрабатывает ли 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);
}
}
1

По вопросам рекламы [email protected]