2014-09-11 70 views
1

我正在通过重载void keyPressEvent (QKeyEvent* eventPtr)方法来处理窗口小部件中的按键事件。按键事件仅由应用程序的一个实例处理

问题是,当我启动我的应用程序的两个实例(来自Qt Creator)时,只有其中一个实际处理按键事件。即使我专注于第二个窗口,它也不会收到事件。当我把重点放在第一个实际上确实收到事件。

当两个应用程序启动时,所有其他功能都可以正常工作。

这是一个预期的行为或一个已知的问题,或者我错过了什么?

UPD:我发现一些按键(例如字母)实际上被两个窗口接收。但只有一个窗口收到箭头键按下。当我创建一个我的小部件的实例时,我会调用它的widget->setFocus()。这使小部件接收箭头按键。但是,当这个应用程序的两个实例启动时,这不起作用。

也许我应该使用事件过滤器呢?

+0

你怎么知道第二个应用程序没有收到事件? – vahancho 2014-09-11 08:09:09

+0

@vahancho'keyPressEvent'中的代码仅在应用程序的一个实例中执行。 – Kolyunya 2014-09-11 08:12:37

+0

@vahancho我也可以在调试器中看到,由于没有达到断点,控件没有重新执行'keyPressEvent'。 – Kolyunya 2014-09-11 08:17:38

回答

1

由于您没有提供我不是100%肯定这是你的问题的原因,但是如果你开始的QtCreator两个实例,qDebug()不会产生在QtCreator二审任何输出的任何代码。
如果你使用那个(或者可能是cout/printf),那么试着在keyPressEvent处理器中做一些你可以在应用中看到的东西,比如改变背景颜色或者显示一个消息框。

除非您安装了全局密钥钩子,并且您的keyPressEvent处理程序消耗了所有的关键事件,否则一个应用程序将无法消除具有焦点的应用程序的事件。

1

从Qt Creator运行程序时,您可以在Qt Creator的“应用程序输出”窗口中看到来自qDebug的消息。但是,如果您以这种方式运行多个程序,同时只有一个程序将被附加在那里输出其消息。

你可以做的是从Qt Creator运行一个,第二个从命令行使用cmd.exe(Windows)或Terminal.app(OSX)运行。这样,第二个程序将在命令或终端程序窗口中输出其qDebug消息。

+0

应用程序的两个实例确实有效地将调试信息打印到'qtcreator_process_stub'中,所以这不是问题。我还发现,两个窗口都收到了一些按键。问题是只能通过一个窗口接收箭头按键。我已经更新了这个问题。 – Kolyunya 2014-09-11 08:56:52

+0

我假设你使用的是Windows。在OSX上,我从来没有2个应用程序将调试信息打印到Qt的控制台。至于你的问题,我认为我们需要看到更多的代码来确定问题。我怀疑这跟调用widget-> setFocus有什么关系 – TheDarkKnight 2014-09-11 09:02:50

相关问题