PyQt4:QTextEdit 从第 n 行开始
Posted
技术标签:
【中文标题】PyQt4:QTextEdit 从第 n 行开始【英文标题】:PyQt4: QTextEdit start in nth line 【发布时间】:2016-11-10 15:26:33 【问题描述】:我有一个只包含 QTextEdit 的弹出窗口,里面有很多文本,很多行。我希望它在 show() 上滚动到 QTextEdit 中的某一行。这样我想要的线就在顶部。
代码sn-p:
editor = QtGui.QTextEdit()
# fill the editor with text
# set the scroll to nth line
editor.show()
我怎样才能做到这一点?
更新
我已经设法让它在底部显示第 n 行:
cursor = QtGui.QTextCursor(editor.document().findBlockByLineNumber(n))
editor.moveCursor(QtGui.QTextCursor.End)
editor.setTextCursor(cursor)
例如对于 n=25,我得到:
_______________________
.
.
.
.
25th line
_______________________
但我需要它在顶部...
【问题讨论】:
需要操作垂直滚动条。知道页面大小和文本编辑中有多少行,您可以计算出可以向上滚动文本编辑多少。见有些相关:***.com/questions/4939151/… 【参考方案1】:你几乎拥有它。诀窍是将当前光标移动到底部首先,然后将光标重置到目标行。然后视图将自动滚动以使光标可见:
editor.moveCursor(QtGui.QTextCursor.End)
cursor = QtGui.QTextCursor(editor.document().findBlockByLineNumber(n))
editor.setTextCursor(cursor)
通过扩展,将光标定位在底部,首先将当前光标移动到开头:
editor.moveCursor(QtGui.QTextCursor.Start)
...
这是一个演示脚本:
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
self.edit = QtGui.QTextEdit(self)
self.edit.setPlainText(
'\n'.join('%04d - blah blah blah' % i for i in range(200)))
self.button = QtGui.QPushButton('Go To Line', self)
self.button.clicked.connect(self.handleButton)
self.spin = QtGui.QSpinBox(self)
self.spin.setRange(0, 199)
self.spin.setValue(50)
self.check = QtGui.QCheckBox('Scroll Top')
self.check.setChecked(True)
layout = QtGui.QGridLayout(self)
layout.addWidget(self.edit, 0, 0, 1, 3)
layout.addWidget(self.button, 1, 0)
layout.addWidget(self.spin, 1, 1)
layout.addWidget(self.check, 1, 2)
QtCore.QTimer.singleShot(0, lambda: self.scrollToLine(50))
def scrollToLine(self, line=0):
if self.check.isChecked():
self.edit.moveCursor(QtGui.QTextCursor.End)
else:
self.edit.moveCursor(QtGui.QTextCursor.Start)
cursor = QtGui.QTextCursor(
self.edit.document().findBlockByLineNumber(line))
self.edit.setTextCursor(cursor)
def handleButton(self):
self.scrollToLine(self.spin.value())
self.edit.setFocus()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 100, 400, 300)
window.show()
sys.exit(app.exec_())
【讨论】:
不错的解决方案。一件事:这当然只有在剩下足够多的行时才有效(总行数 m 减去所需的行 n 必须等于或大于视口中显示的行数)。此外,可能不需要滚动到底部,只需向下滚动足够远(例如滚动到第 n + x 行(视口中显示的行数))。 @Trilarion。我不认为QTextEdit
能够像某些编辑器控件(例如 Scintilla)那样滚动到最后一行之外,所以第一点似乎没有实际意义。我也没有看到首先将光标移动到末尾有任何明显的性能影响(我使用 300k 行文件进行了测试)。
这个解决方案听起来不错,但对我不起作用。带有光标的行最后显示在 QTextEdit 中。是否有任何进一步的要求? (我在 python 2.7 上使用 PyQt 4.8)
@ImportanceOfBeingErnest。使用 PyQt-4.7、PyQt-4.9.5 和 PyQt-4.11.4 和 Python-2.7 对我来说效果很好。你确定你使用的是QTextCursor.End
?
@ekhumoro 我只是从上面复制了三行并将它们放入类的 init 方法中。这似乎正是问题所在。因此,上面的代码只有在绘制 Widget 之后才能工作。相比之下,问题中的方法(将光标设置为 TextEdit 底部的行)在绘制之前也可以工作。以上是关于PyQt4:QTextEdit 从第 n 行开始的主要内容,如果未能解决你的问题,请参考以下文章
python PyQt4中如何获得QTextEdit的内容获得QLineEdit的内容有QLineEdit.text(),那QTextEdit呢?
C语言 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人是原来的第几号?