我正在使用以下简单代码显示警告框:
w = QWidget()
result = QMessageBox.warning(w, 'a', x, QMessageBox.Ok)
有什么办法可以动态更改MESSAGE?我想制作一个弹出窗口,该弹出窗口将通知用户在后台运行的任务的进度。
编辑:
好吧,我试图通过编写此脚本进行测试:
def handleButton(self):
self.msgBox = QMessageBox(self)
self.msgBox.setWindowTitle("Title")
self.msgBox.setIcon(QMessageBox.Warning)
self.msgBox.setText("Start")
self.msgBox.show()
x = 0
for x in range (100):
x = x + 1
print (x)
self.msgBox.setText(str(x))
self.msgBox.show()
time.sleep(1)
仅在完成“ for循环”后显示文本,为什么?
答案 0 :(得分:2)
您可以创建类的对象,而不是使用静态方法。
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.msgBox = QMessageBox(self)
self.msgBox.setWindowTitle("Title")
self.msgBox.setIcon(QMessageBox.Warning)
self.msgBox.setText("Start")
self.msgBox.show()
timer = QTimer(self)
timer.timeout.connect(self.onTimeout)
timer.start(1000)
def onTimeout(self):
self.msgBox.setText("datetime: {}".format(QDateTime.currentDateTime().toString()))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
更新:
您的示例中的问题是使用time.sleep()
。 Qt在一个事件循环中执行,该事件循环允许您处理鼠标,键盘,重绘等事件。但是time.sleep()
会阻止该事件循环,您可以检查是否尝试更改窗口的大小,会看到您做不到。
假设您使用time.sleep()
暂停,那么必须将QEventLoop
与QTimer
一起使用,这不会阻塞Qt事件循环。
def handleButton(self):
self.msgBox = QMessageBox(self)
self.msgBox.setWindowTitle("Title")
self.msgBox.setIcon(QMessageBox.Warning)
self.msgBox.setText("Start")
self.msgBox.show()
for x in range(100):
self.msgBox.setText(str(x+1))
loop = QEventLoop()
QTimer.singleShot(1000, loop.quit)
loop.exec_()