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 で試しました。
私はこれをすべて間違っていますか?