gpt4 book ai didi

python - QProgressDialog 的残骸挥之不去——有时

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:44 25 4
gpt4 key购买 nike

    progress = QtGui.QProgressDialog("Parsing Log", "Stop", 0,numberOfLinesInFile , self)
progress.setWindowModality(QtCore.Qt.WindowModal)

for lineNumber, line in enumerate(file):
# yield a bit to the Qt UI handler
QtGui.QApplication.processEvents()
progress.setValue(lineNumber + 1) # lineNumber is zero-based so need the plus one to match the more literal numberOfLinesInFile
if progress.wasCanceled():
progressWasCancelled = True
break


# ...read and parse lines from file (20mb takes ~10 seconds)


# crank the progress bar through to completion to get rid of it
# this seems to forgo the opportunity to use progress.wasCanceled() subsequently?
progress.setValue(numberOfLinesInFile)


if not progressWasCancelled:
self.updateTable(self.requestRoster)

在此之后,无论进度对话框是否被取消,进度对话框都会被隐藏(它会滑回工具栏)。但是如果我切换应用程序(Mac 上的“命令选项卡”)然后切换回我的应用程序,QProgressDialog 的幽灵就会出现在主应用程序窗口的前面!它的进度条为 100%,停止按钮为蓝色但不闪烁。它没有反应。如果我移动应用程序窗口,它就会消失。

如果我在 progress.setValue(numberOfLinesInFile) 之后调用 progress.destroy() 似乎有帮助。但是从文档中复制示例并被咬似乎令人担忧,而且我不知道 destroy() 的后果。

我使用的是 PySide,我切换到 PyQt 和同样的事情。

此外,有时 progress.setValue(numberOfLinesInFile) 导致后续读取 progress.wasCancelled() 返回 false(但有时它返回 true!)这就是为什么我设置我自己的 progressWasCancelled。它的随机性令人不安。

我使用的是 Mac 10.6.8、Qt 4.8.2、Python 2.7。尝试使用 PySide 1.1.0 和 PyQt 4.9.4。

我做错了吗?

最佳答案

我无法在 Mac 上进行测试,但我会尝试提出一些有助于解决您的问题的建议。

首先,如果您使用模态进度对话框,则无需调用processEvents(),因为对话框会自行处理。

其次,您代码中的这一行:

    progress.setValue(lineNumber + 1)

是有问题的,因为要引用 Qt docs :

For the progress dialog to work as expected, you should initially set this property to 0 and finally set it to QProgressDialog::maximum(); you can call setValue() any number of times in-between.

因此您应该在循环之前调用 progress.setValue(0),或者完全避免添加偏移量。此外,在最后一次迭代中,lineNumber + 1 将等于最大值,即 reset此时的对话框(除非 autoReset 已设置为 False)。正是出于这个原因,Qt 示例在循环完成后调用 setValue(maximum)

最后,在完成进度对话框后调用 destroy()deleteLater() 没有问题 - 事实上,这是个好主意。当您将 self 传递给 QProgressDialog 构造函数时,它将成为对话框的父级并保留对它的引用。因此,除非您明确删除它,否则每次调用使用它的函数时都会添加一个新的子对话框(加上它的所有子对象)(这可能会浪费大量内存)。

这是一个可能需要改进的演示脚本:

import sys, time
from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.button = QtGui.QPushButton('Test', self)
self.button.clicked.connect(self.handleButton)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.button)

def handleButton(self):
file = range(30)
numberOfLinesInFile = len(file)
progressWasCancelled = False
progress = QtGui.QProgressDialog(
"Parsing Log", "Stop", 0, numberOfLinesInFile, self)
progress.setWindowModality(QtCore.Qt.WindowModal)
progress.setMinimumDuration(0)
for lineNumber, line in enumerate(file):
progress.setValue(lineNumber)
if progress.wasCanceled():
progressWasCancelled = True
break
time.sleep(0.05)
progress.setValue(numberOfLinesInFile)
print 'cancelled', progress.wasCanceled(), progressWasCancelled
progress.deleteLater()

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

关于python - QProgressDialog 的残骸挥之不去——有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com