これが実際に機能するかどうかはわかりませんが、これを試してみてください:
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-only などではない)、QApplication::sendEvent() 自体が伝播しないことを願っています。
これがうまくいくことを願っています、頑張ってください!
(ps。このコードはテストまたはコンパイルされていません)