在 QTextEdit 中一次显示一行

问题描述 投票:0回答:1

enter code here
我正在尝试读取文件并使用 QEditText 显示其行。我的代码对于小文件运行良好,因为我使用
file.read()
将整个文件存储在字符串中。然后将整个字符串传递给 QEditText。

class MainWindowUi(qtw.QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        
        self.setWindowTitle("Logger")
        self.resize(800,800)
        self.setMaximumWidth(800)
        self.setMinimumHeight(800)
        self.layout=qtw.QGridLayout()
        self.upload_file_button=qtw.QPushButton("Upload")
        
        self.display_result=qtw.QTextEdit()
        self.display_result.setReadOnly(True)
        self.display_result.setAcceptRichText(True)
        

        self.layout.addWidget(self.display_result,0,0,0,3)
        self.layout.addWidget(self.upload_file_button,0,4,1,2)
        
        self.setLayout(self.layout)
        
        self.upload_file_button.clicked.connect(self.open)
        self.show()


     def open(self):
        path = qtw.QFileDialog.getOpenFileName(self, '', '',
                                           'Text files (*.txt *log*)')
        if path[0]:
                file=open(path[0],'r',encoding="utf8")
                self.display_file(file.read())
                file.close()


     def  display_file(self,txt=None):
        if len(txt)>0:
            self.display_result.moveCursor( qtg.QTextCursor.End)
            self.display_result.insertPlainText(txt)
        else:
           pass

但是对于大文件来说这并不是最佳选择。所以我想一次将一行传递给 QEditText,以便它一次显示一行并自动滚动到末尾。就像我们使用

for line in file: print (line)
打印文件行一样 所以我尝试这样做。

 def open(self):
        path = qtw.QFileDialog.getOpenFileName(self, '', '',
                                           'Text files (*.txt *log*)')
        if path[0]:
                file=open(path[0],'r',encoding="utf8")
                for line in file:
                    self.display_file(line)
                file.close()

但它并没有按照我想要的方式工作。它像前面的代码一样一次性显示整个文件。我对信号和老虎机没有太多了解。但看起来,QEditText 仅在

Open
插槽的工作完成时才显示值。

编辑:我想这样做的原因是我不希望我的用户界面冻结直到整个文件加载完毕。

python pyqt5 qtextedit
1个回答
0
投票

解决您的问题的一种可能性是使用 QTextCursor 的

beginEditBlock
endEditBlock

在你的代码中,

类 MainWindowUi(qtw.QWidget): def init(self,*args,**kwargs): super().init(*args,**kwargs)

    self.setWindowTitle("Logger")
    self.resize(800,800)
    self.setMaximumWidth(800)
    self.setMinimumHeight(800)
    self.layout=qtw.QGridLayout()
    self.upload_file_button=qtw.QPushButton("Upload")
    
    self.display_result=qtw.QTextEdit()
    self.display_result.setReadOnly(True)
    self.display_result.setAcceptRichText(True)
    

    self.layout.addWidget(self.display_result,0,0,0,3)
    self.layout.addWidget(self.upload_file_button,0,4,1,2)
    
    self.setLayout(self.layout)
    
    self.upload_file_button.clicked.connect(self.open)
    self.show()


 def open(self):
    path = qtw.QFileDialog.getOpenFileName(self, '', '',
                                       'Text files (*.txt *log*)')
    if path[0]:
            file=open(path[0],'r',encoding="utf8")
            self.display_file(file.read())
            file.close()


 def  display_file(self,txt=None):
    tc = self.display_result.textCursor()
    tc.beginEditBlock()
    if len(txt)>0:
        tc.moveCursor( qtg.QTextCursor.End)
        tc.insertText(txt)
    else:
       pass
    tc.endEditBlock()

beginEditBlock
endEditBlock
用于将撤消框架放在一起。 但它们有一个隐藏的有用的副作用。对于您的问题代码,每当调用
contentsChange
时都会发出
insertPlainText
信号。也就是说,你的
documentlayout
每次插入都会更新。这需要花费大量时间。即使您插入一个字符,如果您的文档已经有 10000 行,所有布局都会重新计算和更新。

beginEditBlock
可以停止更新,直到您拨打
endEditBlock
。布局更新仅在最后一次完成。

请尝试使用这些功能。

请参阅富文本高级处理

© www.soinside.com 2019 - 2024. All rights reserved.