我正在使用 PySide (Qt) Gui,它应该在单击按钮时退出循环。PySide 的按钮单击会发出一个信号,该信号会调用连接的函数。然而,当信号调用函数时,它使用它自己的系统进行错误处理。
我真的不想修复那个信号错误处理。
有没有办法在不引发错误的情况下打破“with”语句。
import sys
import time
from PySide import QtGui, QtCore
class MyClassError(Exception): pass
class MyClass(QtGui.QProgressDialog):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Properties
self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowTitleHint)
self.setWindowModality(QtCore.Qt.WindowModal)
self.setMinimumDuration(2000) # if progress is finished in 2 sec it wont show
self.setRange(0, 99)
# end Constructor
def breakOut(self):
print("break out")
self.__exit__(MyClassError, "User cancel!", "") # does not break out of "with"
raise MyClassError("User cancel!") # PySide just prints Exception
# end breakOut
def __enter__(self):
self.canceled.connect(self.breakOut)
return self
# end enter (with)
def __exit__(self, etype, value, traceback):
# self.canceled.disconnect(self.breakOut)
if etype is None or etype == MyClassError:
return True
raise
# end exit
# end class MyClass
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.show()
myinst = MyClass()
window.setCentralWidget(myinst)
val = 0
with myinst:
for i in range(100):
myinst.setLabelText(str(i))
myinst.setValue(i)
val = i+1
time.sleep(0.1)
# end with
print(val)
sys.exit(app.exec_())
我在信号中看到的 PySide/Qt 错误处理的修复看起来不太好。它覆盖了 QApplication,这意味着使用此类的其他人必须使用新的 QApplication。
PySide/Qt 信号错误处理是否有一种简单的方法,或者是否有另一种方法可以打破“with”语句。