父窗口未接收到窗口消息(键事件)

4
我有一个使用win API编写的GUI应用程序,当用户选择某些命令菜单项时,我们需要启动一个新的GUI应用程序。我们决定使用PyQt编写新应用程序,并使用Python C Api启动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按键事件吗? - Chenna V
是的,父窗口不是QtWigget,它完全是使用C和WinAPI编写的,并且PyQt窗口是通过在该C代码中嵌入Python解释器来启动的。 - Maverick
应该通过调用exec()来运行QApplication,这是一个阻塞调用,所以我猜你正在单独的线程中运行它。我不希望任何按键被发送到父窗口,因为它不是PyQt窗口的父部件。 - Chenna V
使用Python C API,我们可以导入Python模块并运行它,最终调用QApplication的exec()方法。我们没有使用任何新线程来启动PyQt应用程序,除了键事件之外,仍然没有被阻塞的内容。 - Maverick
2个回答

0

0

我相信你想要做的事情——在单个进程中操作两个独立的GUI——不受任何主流操作系统支持。一段时间以前,我搜索了很长时间,试图找到方法来实现这一点,但除了“不要这样做”之外,我从未得到过任何建议。

我很惊讶缺少键是你唯一遇到的问题...我建议在你发现更多麻烦之前找到一个不同的解决方案(除非你能找到一些好的证据表明这至少应该可以工作)。

也许你可以生成一个新的进程来运行Qt事件循环?由于你已经将Python嵌入到主进程中,所以这应该相当容易——使用Python的内置IPC来处理进程间通信。


你实际上并没有运行两个独立的GUI。在Windows上,Qt只是Win32 API的一个包装器。可以使用QtWinMigrate DLL将两者结合在C++中一起工作。 - cdiggins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接