我是Qt的新手,遇到一个我无法处理的问题,比如一个月。情况是这样的: 我有OpenSceneGraph项目(这是OpenGL)并试图在3d场景中制作Qt接口。我认为没有必要我如何处理,但如果有人想知道更多here是关于OSG论坛的更多信息的线程(虽然我没有在那里得到解决方案)。问题是,当点击键盘上的任何键时,Qt控件在屏幕上跳转并且不再对任何(鼠标或键盘)事件做出反应。不过,整个计划仍在继续。 总而言之,我的问题是:有没有办法让Qt小部件忽略所有按键? 我搜索了很多,但找不到任何可行的解决方案。
提前致谢!
答案 0 :(得分:2)
阅读一下events in Qt。有一个关于事件过滤的部分(但请不要直接跳到它:P)。
简短回答:
void 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
变量上set an event filter。这是更优雅的解决方案,但它过于复杂,因为它过滤原生事件,需要一些工作......
您可以执行的操作仅过滤您的顶级窗口小部件或窗口(没有父项的窗口)。您可以定义一个事件过滤器(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));
就是这样!