- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
我正在使用 cron 运行以下脚本,在/etc/cron.d/mycron 我有以下内容: */10 * * * * MyUserThatNeedsToRunTheScript /backup/ssh
我是一名优秀的程序员,十分优秀!