PyQt4 QMessageBox文本更改

时间:2018-06-22 09:39:45

标签: python pyqt pyqt4

我正在使用以下简单代码显示警告框:

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循环”后显示文本,为什么?

1 个答案:

答案 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()暂停,那么必须将QEventLoopQTimer一起使用,这不会阻塞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_()