【问题标题】:How to dynamically update QTextEdit如何动态更新 QTextEdit
【发布时间】:2014-08-13 19:25:05
【问题描述】:

所以我在 GUI 的主窗口中有一个 QTextEdit。我想通过从远程更新列表中提取来实时更新其中的文本。我不知道如何在没有 a) 执行无限循环或 b) 线程的情况下无限检查此列表。

a) 使 GUI 崩溃,因为它是一个无限循环 b) 产生错误提示:

QObject: Cannot create children for a parent that is in a different thread.

我明白了。

我能做些什么来解决这个问题?

【问题讨论】:

  • 为什么不使用信号和插槽来动态更新 GUI?
  • 另见stackoverflow.com/questions/21071448/…(不是这个的重复,但高度相关)
  • @three_pineapples。虽然我很欣赏你的 cmets,但我认为这两种方法都不合适。在您发布的第一个链接中,像我一样,使用 python 线程而不是 Qthreads,正如您所指出的那样。您的答案的第二个链接也涉及 Qthreads。此外,这些都没有提到动态更新(运行时实时更新)。也许您可以澄清您对我的问题的可能解决方案,而不是提供方向不明确的链接。
  • 是的,但是你不应该从线程中调用任何 QTextEdit 方法,它有使程序崩溃的风险。所以你需要发出另一个信号来清除它。

标签: python pyqt pyqt4 qtextedit


【解决方案1】:

这就是它在没有线程的情况下的工作方式:)

1) 创建pyqt textEditor logView:

self.logView = QtGui.QTextEdit()

2) 将 pyqt texteditor 添加到布局中:

layout = QtGui.QGridLayout()
layout.addWidget(self.logView,-ROW NUMBER-,-COLUMN NUMBER-)
self.setLayout(layout)

3) 神奇的功能是:

def refresh_text_box(self,MYSTRING): 
    self.logView.append('started appending %s' % MYSTRING) #append string
    QtGui.QApplication.processEvents() #update gui for pyqt

在你的循环中调用上面的函数或将连接的结果字符串直接传递给上面的函数,如下所示:

self.setLayout(layout)
self.setGeometry(400, 100, 100, 400)
QtGui.QApplication.processEvents()#update gui so that pyqt app loop completes and displays frame to user
while(True):
    refresh_text_box(MYSTRING)#MY_FUNCTION_CALL
    MY_LOGIC
#then your gui loop
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog = MAIN_FUNCTION()
sys.exit(dialog.exec_())

【讨论】:

  • 这听起来很有希望@hemraj。这还会刷新我在 GUI 中可能拥有的任何其他内容吗?例如表格小部件。我会把它放在什么循环中?
  • 感谢您的回答。 QtGui.QApplication.processEvents() 解决了我的问题。
  • 我不明白它应该如何工作......就像我尝试了很多方法来运行你的代码但我没有得到它......:/
【解决方案2】:

选择QThread,毕竟,将代码从python 线程移动到QThread 应该不难。 恕我直言,使用信号和插槽是唯一干净的解决方案。这就是Qt 的工作原理,如果你适应它,事情就会变得更容易。 一个简单的例子:

import sip
sip.setapi('QString', 2)

from PyQt4 import QtGui, QtCore

class UpdateThread(QtCore.QThread):

    received = QtCore.pyqtSignal([str], [unicode])

    def run(self):
        while True:
            self.sleep(1) # this would be replaced by real code, producing the new text...
            self.received.emit('Hiho')

if __name__ == '__main__':

    app = QtGui.QApplication([])

    main = QtGui.QMainWindow()
    text = QtGui.QTextEdit()
    main.setCentralWidget(text)

    # create the updating thread and connect
    # it's received signal to append
    # every received chunk of data/text will be appended to the text
    t = UpdateThread()
    t.received.connect(text.append)
    t.start()

    main.show()
    app.exec_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多