如何阻止qt应用程序冻结主程序?

2024-01-05

例如:

#!/usr/bin/env python3

import sys
from PySide import QtCore, QtGui

class Dialog(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        button = QtGui.QPushButton("test")
        layout = QtGui.QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()
app.exec_()
print("App freezes the main process!")

在关闭对话框之前,最后一个 print() 函数将不会被执行。

我正在开发一个仅使用 qt 来显示一些不需要用户交互的内容的脚本,因此我更喜欢在后台运行 gui 代码。


这不可能。Qt 文档 http://qt-project.org/doc/qt-5/threads-qobject.html states:

虽然QObject是可重入的,GUI 类,特别是QWidget及其所有子类都是不可重入的。它们只能从主线程。如前所述,QCoreApplication::exec()还必须从那个线程.

(emphasis mine)

这个答案 https://stackoverflow.com/a/22290909/2642204另一方面表明实际上这不是真的:)但是 PySide 似乎坚持官方版本:

这可以通过以下代码示例进行验证:

import sys
import threading
from PySide import QtCore, QtGui

class Dialog(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        button = QtGui.QPushButton("test")
        layout = QtGui.QVBoxLayout()
        layout.addWidget(button)
        self.setLayout(layout)

app = QtGui.QApplication(sys.argv)
toast = Dialog()
toast.show()

t = threading.Thread(target = lambda: app.exec_())
t.daemon = True
t.start()
print("App freezes the main process!")
input()

产生以下输出:

App freezes the main process!
QApplication::exec: Must be called from the main thread

(以及我的机器上的崩溃)。我还验证了该选项creating the app在另一个线程中 - 它可以工作,但在退出时崩溃。


所以解决方案似乎让Qt拥有主线程,并在单独的线程中组织您的处理。这实际上不应该是一个问题:如果您能够很好地分离您的关注点,那么它不会对您的控制台应用程序部分在哪个线程上运行产生影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阻止qt应用程序冻结主程序? 的相关文章

随机推荐

  • 变长系列

    我试图确定是否可以在 Excel 中编写以下计算 其中 n 是变量并且来自用户输入 n的值是正数并且等于或大于1 是否可以写一个公式而不是使用vba 2 1 2 2 2 3 2 n If n 1 then the calculation w
  • JavaFX:对单击、双击和三次单击的反应

    我正在尝试配置某些操作来响应鼠标单击次数 在我看来 单击和三次单击被检测到并应用 但双击实际上不起作用 我尝试做类似的事情 if doubleClick else if tripleClick else if singleClick 检查顺
  • 使用 CGAffineTransform 倾斜 UIImageView

    我试图倾斜一个矩形 使两个垂直边倾斜但平行 顶部和底部是水平的 我正在尝试使用 CGAffineTransform 并找到了这段代码 但我不知道要在各个部分中放入什么 imageView layer somethingMagic image
  • 如何取消自定义等待

    我读了斯蒂芬 图布的博客 https devblogs microsoft com pfxteam awaiting socket operations 关于为 SocketAsyncEventArgs 制作自定义等待 这一切都很好 但我需
  • Keyvault 身份验证(REST API)

    我对微软分散的文档有点困惑 我创建了一个应用程序 https learn microsoft com en us azure azure resource manager resource group create service prin
  • 在SOLID中,SRP和ISP有什么区别? (单一职责原则和接口隔离原则)

    如何SOLID http en wikipedia org wiki Solid object oriented design 接口隔离原则 与 单一职责原则 有何不同 维基百科SOLID 条目说 http en wikipedia org
  • UIStackView 中的多行标签

    将多行标签 换行符设置为自动换行 放入堆栈视图时 标签会立即丢失换行符并在一行中显示标签文本 为什么会发生这种情况以及如何在堆栈视图中保留多行标签 正确答案在这里 https stackoverflow com a 43110590 566
  • cocoa 再次错误 134100 - (用于打开的模型与用于创建的模型不兼容...)

    我在这里看到了这个问题 但总是 答案是模型已更改 重置模拟器 删除商店 我也收到此错误 但是 这是一个新应用程序 我没有添加 更改实体或属性 我删除了商店 重置了模拟器 但得到了相同的结果 这是商店代码 这个问题还有其他原因吗 NSMana
  • jQuery:分离并重新附加元素而不重新加载内容

    我想知道是否可以使用 jQuery 分离然后将元素 例如 div 重新附加到 DOM 而无需重新加载元素内的内容 考虑这个示例布局 div class row div class col lg 6 div class card img sr
  • 如何在执行剧本时在命令行中添加多个清单文件

    我有一本包含两种不同玩法的剧本 Sample yml name Play1 hosts Host1 tasks name Play2 hosts Host2 tasks 我需要用两个不同的主机运行这个剧本 主机1和主机2 并且这两个不同的主
  • PDO lastInsertId 不适用于事务?

    我是第一次在 MySQL 中使用 PDO 目前只是在玩它 到目前为止 当我尝试在事务中进行插入时 this gt dbh gt beginTransaction sql query ran this gt dbh gt commit ech
  • jquery滑块背景颜色

    我是网络编程新手 我正在尝试创建包含滑块的网站 我目前正在使用 jquery 来创建滑块 我试图在滑块值小于 5 时将滑块的背景颜色更改为红色 在滑块值大于 5 时将其背景颜色更改为绿色 如何实现此目的 我必须使用 CSS 来完成这个任务吗
  • 将 lib 添加到 Rails 3 中的“config.autoload_paths”不会自动加载我的模块

    我在旁边放置了一个文件名 g rbRails root lib文件夹 文件内容是这样的 module Google end 然后我添加 config autoload paths W config root lib Rails root a
  • 具有形状 (n,) 的 Sympylambdaify 数组

    我目前与 sympy 存在以下 问题 我有一个象征性的表达 比如M matrix pi a sin 1 b 我想要lambdify并传递给数值优化器 问题是优化器需要函数来输入 输出形状的 numpy 数组 n 特别是不 n 1 现在我已经
  • cmake 和使用“make -jN”的并行构建

    我正在尝试为我的源树设置一个基于 CMake 的并行构建 但是当我发出 cmake make j2 I get jobserver unavailable using j1 Add to parent make rule 作为警告 有谁知道
  • printf 如何知道 CString 字符数据的地址?

    考虑这个代码片段 struct My operator const char const return my my CStringA s aha printf s s s my another variadic function to ge
  • 如何使RecyclerView中每个项目的大小不同?

    I want to achieve something like this But here s what I get after trying 我已经将项目布局的高度设置为 WRAP CONTENT 但结果仍然相同 我应该怎么办 对于那些
  • SwiftUI 中的描边图像边框

    我正在尝试在 SwiftUI 中重新创建 Apple 的节日灯光图像 来自 Apple India 网站的屏幕截图 预期结果 这是我迄今为止所取得的成就 到目前为止我的理解 图像不是形状 所以我们不能抚摸它们的边界 但我还发现shadow
  • 在 Selenium 中如何处理新窗口?

    我正在编写一个硒脚本来登录并创建新邮件 发送邮件并注销 但是当我单击 新邮件 按钮时 它会打开一个新窗口 在硒中我如何处理这个问题 我是硒的新手 请详细解释一下 使用下面的代码 你必须使用 getWindowHandles 我希望它有帮助
  • 如何阻止qt应用程序冻结主程序?

    例如 usr bin env python3 import sys from PySide import QtCore QtGui class Dialog QtGui QDialog def init self QtGui QDialog