阅读一些关于Qt 中的事件。有一个关于事件过滤的部分(但请不要直接跳到它:P)。
简短的回答:
无效 Qwidget::setEnabled ( bool );
缺点是它还禁用了鼠标事件,更改了小部件样式,这很糟糕。
长答案:过滤事件
一种可能性是过滤 Qt 应用程序上的所有事件。我想启动你的 Qt 代码的函数看起来像这样(如果这里有不同的帖子):
int main(int argc, char* argv[]){
QApplication app(argc, argv);
QWidget toplevelwidget1;
toplevelwidget1.show()
//stufff
return app.exec();
}
//doesnt have to exactly like this.
您可以在变量上设置事件过滤器。app
这是更优雅的解决方案,但它太复杂了,因为它过滤原生事件并且需要一些工作......
相反,您可以做的是仅过滤您的顶级小部件或窗口(没有父级的窗口)。您定义一个事件过滤器(它是 a QObject
),例如:
class KeyboardFilter: public QObject
{
Q_OBJECT
...
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
bool KeyboardFilter::eventFilter(QObject *obj, QEvent *event)
{
//for all events from keyboard, do nothing
if (event->type() == QEvent::KeyPress ||
event->type() == QEvent::KeyRelease ||
event->type() == QEvent::ShortcutOverride ||
) {
return true;
} else {
// for other, do as usual (standard event processing)
return QObject::eventFilter(obj, event);
}
}
然后使用以下方法在所需的小部件上设置过滤器:
myDesiredWidgetorObject->installEventFilter(new KeyboardFilter(parent));
就是这样!