如何让 addItem() 添加的文本立即出现在 QDialog window 上?

How do I make text added by addItem() appear on QDialog window immediately?

最近我写了这个程序,其中有一个带有按钮的 QMainWindow 和一个在按下按钮时打开的 QDialog。 我还有一个 [text](它写在 infoWindow class 上方),我希望它逐字出现在 QDialog 上,但现在它在我的程序完成工作时一起出现。 我搜索了很多但找不到我正在搜索的内容 for.So 如果你能告诉我一些让我的 [文本] 逐字显示的方法那就太棒了:)))

这是我的代码

import time , sys

from PyQt5 import QtWidgets

from PyQt5 import uic

from PyQt5.QtWidgets import QTextBrowser


text = ["Lorem ", "Ipsum", " is ", "simply", " dummy", " text", " of the printing", " and", " typesetting", " industry"]



class infoWindow(QtWidgets.QDialog):

    def __init__(self):
        super(infoWindow, self).__init__()

        uic.loadUi(r"window_design\info_window.ui", self)
        self.setFixedSize(850, 500)

    def textAdd(self):
        self.show()
        for word in text:
            self.infoList.addItem(word)
            time.sleep(0.2)


class main(QtWidgets.QMainWindow):

    def __init__(self):
        super(main, self).__init__()

        uic.loadUi(r"window_design\main.ui", self)
        self.info_window = infoWindow()
        self.setFixedSize(850, 500)
        self.pushButton.clicked.connect(self.info_window.textAdd)


if __name__ == '__main__':
    my_app = QtWidgets.QApplication(sys.argv)

    window = main()
    window.show()

    sys.exit(my_app.exec())

GUI 系统是 事件驱动的 ,这意味着控制 必须 始终 return 应用程序主线程尽快以允许适当的 UI 更新和用户交互。使用阻塞函数,如 for 循环和 sleep,将阻止所有这些,因此结果是界面仅在函数 returns 时更新:不仅你必须等到所有睡眠都已过期,但您也只会看到 最终 结果(所有项目同时显示)。

解决方案是使用 QTimer,它确保控制被正确地 returned 到应用程序,并且在需要时执行功能而不会阻塞任何东西。

在这种情况下,您可以复制 列表并定期从中弹出元素,直到列表为空:

class infoWindow(QtWidgets.QDialog):
    def __init__(self):
        super(infoWindow, self).__init__()
        uic.loadUi(r"window_design\info_window.ui", self)
        self.setFixedSize(850, 500)
        self.wordList = text[:]

    def textAdd(self):
        self.show()
        self.nextWord()

    def nextWord(self):
        if not self.wordList:
            return
        self.infoList.addItem(self.wordList.pop(0))
        QtCore.QTimer.singleShot(200, self.nextWord)