我不知道这是否真的有效,但你可以试一试:
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.此代码未经测试或编译)