我正在开发一个文本编辑器,我正在使用Qt4.8 / Pyqt特别是QTextedit对象,在Windows 7&使用python 2.7 请考虑以下代码(不是orignal)
def doReplaceAll(self):
# Replace all occurences without interaction
# Here I am just getting the replacement data
# from my UI so it will be different for you
old=self.searchReplaceWidget.ui.text.text()
new=self.searchReplaceWidget.ui.replaceWith.text()
# Beginning of undo block
cursor=self.editor.textCursor()
cursor.beginEditBlock()
# Use flags for case match
flags=QtGui.QTextDocument.FindFlags()
if self.searchReplaceWidget.ui.matchCase.isChecked():
flags=flags|QtGui.QTextDocument.FindCaseSensitively
# Replace all we can
while True:
# self.editor is the QPlainTextEdit
r=self.editor.find(old,flags)
if r:
qc=self.editor.textCursor()
if qc.hasSelection():
qc.insertText(new)
else:
break
# Mark end of undo block
cursor.endEditBlock()
这适用于几百行文本。但是,当我有很多文本说10000到100000行文本替换时,所有这些都非常慢到无法使用,因为编辑器会慢下来。 难道我做错了什么。为什么QTextEdit这么慢,我尝试了QplaingTextEdit也没有太多运气。有什么建议吗?
答案 0 :(得分:0)
如果没有分析,你将难以找到减速的确切内容,但它可能与几个因素有关: PyQT实际上与其C库相关联,处理两者之间的数据可能会导致速度变慢。
但值得注意的是,您不仅要更改该代码中的文本,还要在文本/窗口中重新定位光标。
我可以建议的最大加速是如果你正在进行全局搜索和替换,将所有文本拉入python,使用python替换然后重新插入:
def doReplaceAll(self):
# Replace all occurences without interaction
# Here I am just getting the replacement data
# from my UI so it will be different for you
old=self.searchReplaceWidget.ui.text.text()
new=self.searchReplaceWidget.ui.replaceWith.text()
# Beginning of undo block
cursor=self.editor.textCursor()
cursor.beginEditBlock()
text = self.editor.toPlainText()
text = text.replace(old,new)
self.editor.setPlainText(text)
# Mark end of undo block
cursor.endEditBlock()
答案 1 :(得分:0)
根据QTBUG-3554,QTextEdit
本来就很慢,现在没有希望在Qt4中解决这个问题。
但是,错误报告评论确实显示了查找和替换的替代方法,可以提供更好的性能。这是它的PyQt4端口:
def doReplaceAll(self):
...
self.editor.textCursor().beginEditBlock()
doc = self.editor.document()
cursor = QtGui.QTextCursor(doc)
while True:
cursor = doc.find(old, cursor, flags)
if cursor.isNull():
break
cursor.insertText(new)
self.editor.textCursor().endEditBlock()
在我的测试中,在10k行文件中进行约600次替换或在60k行文件中进行大约4000次替换时,这速度提高了2-3倍。不过,一般表现仍然相当平庸。