【问题标题】:Parent window not receiving window's messages (Key Events)父窗口没有收到窗口的消息(关键事件)
【发布时间】:2012-06-30 03:06:22
【问题描述】:

我有一个使用 win API 编写的 GUI 应用程序 当用户选择一些命令菜单项时,我们需要启动一个新的 GUI 应用程序。 我们决定用 PyQt 编写新的应用程序并使用 Python C Api 启动 PyQt 应用程序。

一切正常,除了我们启动 PyQt 应用程序的父窗口在 PyQt 应用程序打开时没有响应某些事件。一旦我们关闭 PyQt 应用程序,它就会再次开始响应关键事件。

我猜,一旦 PyQt Gui 应用程序启动,消息就不会以某种方式传递到父窗口。

使用 Spy++ 检查我发现了以下结果:

Receives messages for:
  - ALT key
  - F1, F2 keys
  - Mouse events

Does NOT receive messages for:
  - CTRL key
  - All other Fn keys
  - All letter keys
  - SHIFT, CAPS keys

任何解决此问题的想法将不胜感激

【问题讨论】:

  • 所以你的意思是父窗口不是Qt小部件?你是如何启动 QApplication 的?在单独的线程中?您是否在 Qt 小部件中处理 F1、F2 按键事件?
  • 是的,父窗口不是 QtWigget,它完全使用 C 和 WinAPI 编写,PyQt 窗口是通过在 C 代码中嵌入 python 解释器来启动的。
  • 好吧 QApplication 应该通过调用 exec() 来运行,这是一个阻塞调用,所以我猜你是在单独的线程中运行它。而且我希望没有任何按键被发送到父窗口,因为它不是 PyQt 窗口的父窗口小部件。
  • 使用Python C API,我们可以导入python模块并运行它,最终调用QApplication的exec()方法。我们没有使用任何新线程来启动 PyQt 应用程序,除了 Key 事件之外,仍然没有任何内容被阻塞。

标签: winforms qt winapi pyqt windows-messages


【解决方案1】:

我相信您正在尝试做的事情——在一个进程中操作两个单独的 GUI——不受任何主要操作系统的支持。前段时间,我搜索了很长时间的方法来做到这一点,除了“不要”之外,我没有提出任何建议。

我很惊讶钥匙丢失是你唯一的问题。我建议在你发现更多麻烦之前找到一个不同的解决方案(除非你能找到一些很好的证据证明这至少是假设工作)。

您是否可以生成一个新进程来运行 Qt 事件循环?由于您已经在主进程中嵌入了 python,这应该相当容易——使用 python 的内置 IPC 来处理进程之间的通信。

【讨论】:

  • 您实际上并没有运行两个单独的 GUI。在 Windows 上 Qt 只是 Win32 API 的一个包装器。使用 QtWinMigrate DLL 可以使两者在 C++ 中协同工作。
【解决方案2】:

一种解决方案是构建QtWinMigrate 模块来创建一个QWinHost,它支持原生HWND 的父级,但不幸的是它不是PyQt 发行版的一部分。

您可以在这里找到一些来源:https://github.com/glennra/PyQtWinMigrate

这是3ds Max by Blur studio 中的 Python 集成必须做的事情。我目前也是studying the C++ source code of QWinWidget,看看我是否可以使用 Win32 调用制定替代解决方案。

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多