【问题标题】:Key pressed event is handled only by one instance of an application按键事件仅由应用程序的一个实例处理
【发布时间】:2014-11-05 02:21:57
【问题描述】:

我正在通过重载void keyPressEvent ( QKeyEvent* eventPtr ) 方法来处理小部件中的按键事件。

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

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

这是预期行为还是已知问题,或者我可能遗漏了什么?

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

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

【问题讨论】:

  • 怎么知道第二个应用没有收到事件?
  • @vahancho keyPressEvent 中的代码仅在应用程序的一个实例中执行。
  • @vahancho 我也可以在调试器中看到,由于没有到达断点,所以控件没有重新确认keyPressEvent
  • 我怀疑您是否可以使用 QtCreator 同时调试两个实例。如何同时启动两个实例?为什么?
  • @vahancho 我不会同时调试两个实例。我启动了一个调试会话和一个常规会话。只有普通人收到了这些事件。好吧,让我们忘记调试。当我刚刚从 Qt Creator 启动(非调试)应用程序的两个实例时,很明显只有其中一个接收到按键事件,因为在事件处理程序中以编程方式执行的视觉效果仅发生在一个窗口中。此外,事件处理程序中的qDebug() 仅将某些内容打印到第一个窗口的控制台。

标签: qt qt-creator keypress onkeypress


【解决方案1】:

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

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

【讨论】:

  • 应用程序的两个实例确实有效地将调试信息打印到qtcreator_process_stub,所以这不是问题。我还发现两个窗口都收到了一些按键。问题是箭头键的按下只被一个窗口接收。我已经更新了问题。
  • 我假设您使用的是 Windows。在 OSX 上,我从来没有 2 个应用程序将调试信息打印到 Qt 的控制台。至于您的问题,我认为我们需要查看更多代码来识别问题。我怀疑这与调用 widget->setFocus 有什么关系
【解决方案2】:

由于您没有提供任何代码,我不能 100% 确定这是您问题的原因,但是如果您启动两个 QtCreator 实例,qDebug() 将不会在第二个实例中产生任何输出QtCreator.
如果您使用它(或者可能是 cout / printf),那么请尝试在您的应用程序中看到的 keyPressEvent 处理程序中执行某些操作,例如更改背景颜色或显示消息框。

除非您安装了一个全局键挂钩,并且您的 keyPressEvent 处理程序会吃掉所有的键事件,否则一个应用程序不会吃掉具有焦点的应用程序的事件。

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多