【问题标题】:Creating a new Qapplication from Qapplication event loop从 Qapplication 事件循环创建一个新的 Qapplication
【发布时间】:2017-02-01 18:26:55
【问题描述】:

我已经重写了这个问题,以便更清楚。

在我的代码中,我创建了一个 QApplication,使用 QTimer.singleShot() 将一个插槽连接到应用程序,然后执行我的应用程序。

现在在这个插槽中,我想在另一个进程中创建另一个 QApplication,我使用了 multiprocessing.Process 类,并从进程内部尝试启动另一个 QApplication 并执行它,但是我有一个错误,因为事件循环已经在运行!,我知道我不能运行两个事件循环,但我正在另一个进程中运行新的 QApplication,所以它应该运行。

我知道这不是一个常见的实现,但在我的情况下运行它会容易得多。

这是一个代码示例: 我得到的错误是“QCoreApplication::exec: 事件循环已经在运行”

import multiprocessing
from PyQt4 import QtCore,QtGui

def first_app_slot():
    mProcess = multiprocessing.Process(target = run_another_app)
    mProcess.start()
    mProcess.join()

def run_another_app():
    second_app = QtGui.QApplication([])
    second_app.exec_()

if __name__ == "__main__":
    first_app = QtGui.QApplication([])
    QtCore.QTimer.singleShot(0,first_app_slot)
    first_app.exec_()

【问题讨论】:

  • 请发布您的代码!
  • 我不知道你想做什么,有什么错误等等。请让这个问题对其他人有用 - 我们无法读懂你的想法。
  • 对不起,我已经重写了问题,感谢您的反馈。
  • 这看起来像XY Problem。请解释您的真正问题,而不是您认为的解决方案。很可能有更好的方法来实现你想要的。
  • 实际上问题是我被困在这个设置中,我需要从另一个 QApplication 事件循环中启动一个新的 QApplication ,所以我想到的解决方案是在另一个进程中启动另一个 QApplication 但作为你看它不工作。

标签: python qt pyqt multiprocessing qapplication


【解决方案1】:

几个问题

  1. 在您的代码中,您没有调用任何多处理代码(可能是拼写错误)?

  2. 不要在全局范围内创建第一个QApplication,将其放在函数内。在创建新进程之前,multiprocessing 会将全局状态复制到新进程中,本例中包括first_app

例如

def main():
    first_app = QtGui.QApplication(sys.argv)
    ...

if __name__ == '__main__':
    main()

【讨论】:

  • 是的,这是一个错字对不起,我尝试了您提出的解决方案,但它不起作用,我想问题是新进程是作为 QApp 或其他东西的子进程创建的,所以即使应用程序引用 (first_app) 被删除,QApp 仍然存在于进程中,例如可以使用 QCoreApplication.instance() 获得,我希望这个进程完全独立于 QApp 运行。
  • 我知道我的情况的逻辑解决方案是先创建进程,然后在他的进程中启动 QApp,但由于某种原因,我陷入了困境。
猜你喜欢
  • 2013-05-08
  • 2018-10-04
  • 2013-08-27
  • 2017-07-29
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多