Изменение текста PyQt4 QMessageBox

Я использую этот простой код для отображения предупреждений:

w = QWidget() 
result = QMessageBox.warning(w, 'a', x, QMessageBox.Ok)

Есть ли способ динамически изменить СООБЩЕНИЕ? Я хочу сделать всплывающее окно, которое будет информировать пользователя о ходе выполнения задачи в фоновом режиме.

Редактировать:

Ну, я попытался сделать так, чтобы этот скрипт для тестирования:

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 ответ

Решение

Вместо использования статического метода вы можете создать объект класса.

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() блокирует EventLop, это вы можете проверить, пытаясь изменить размер окна, вы увидите, что вы не можете это сделать.

Предполагая, что вы используете 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_()
Другие вопросы по тегам