格式化QtextEdit中的特定行

时间:2014-05-08 19:14:57

标签: python pyqt4

如何选择QTextEdit中的特定行并更改说...字体颜色为绿色

我正在使用QTextEdit小部件来显示文件的内容,这是通过rs232发送的一系列命令。我想提供一些关于正在执行的行的视觉反馈,比如更改文本颜色。

我可以更改附加到QTextEdit的文本的文本文件(对于我显示的日志),但这不起作用。

我一直在研究Qcursors,但有点迷失

3 个答案:

答案 0 :(得分:1)

我认为每次发生变化时,您都可以从相关数据中生成新的TextEdit内容。这应该很容易实现。 QCursor和类似的东西对于可编辑的QTextEdit是好的,这在你的情况下是不正确的。并且无法保证它会更快。

答案 1 :(得分:0)

您将需要使用QTextDocument.findBlockByLineNumber()。当您拥有该块时,您只需搜索“\ n”并使用QTextBlock.firstLineNumber()查看该行的开始和结束位置。然后你可以改变块QTextBlock.charFormat()。

def edit_line(editor, line_number):
    """Use the text cursor to select the given line number and change the formatting.

    ..note:: line number offsets may be incorrect

    Args:
        editor (QTextBrowser): QTextBrowser you want to edit
        line_num (int): Line number  you want to edit.
    """
    linenum = line_number - 1 
    block = editor.document().findBlockByLineNumber(linenum)
    diff = linenum - block.firstLineNumber()
    count = 0
    if diff == 0:
        line_len = len(block.text().split("\n")[0])
    else:
        # Probably don't need. Just in case a block has more than 1 line.
        line_len = 0
        for i, item in enumerate(block.text().split("\n")):
            # Find start
            if i + 1 == diff: # + for line offset. split starts 0
                count += 2 # \n
                line_len = len(item)
            else:
                count += len(item)

    loc = block.position() + count

    # Set the cursor to select the text
    cursor = editor.textCursor()

    cursor.setPosition(loc)
    cursor.movePosition(cursor.Right, cursor.KeepAnchor, line_len)

    charf = block.charFormat()
    charf.setFontUnderline(True) # Change formatting here
    cursor.setCharFormat(charf)
    # cursor.movePosition(cursor.Right, cursor.MoveAnchor, 1)
    # editor.setTextCursor(cursor)
# end edit_line

示例:

editor = QtGui.QTextEdit()
editor.setText("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n")

line_num = 6
edit_line(editor, line_num)

或者一种简单的方法是从“\ n”获取该行的所有文本搜索。在html / css中标记行并重置文本。使用这种方法,您必须将所有内容更改为html并确保格式正确(editor.toHtml())。

答案 2 :(得分:0)

我最终使用了游标:

    self.script_cursor = QtGui.QTextCursor(self.scriptBuffer.document())
    self.scriptBuffer.setTextCursor(self.script_cursor)
    self.script_cursor.movePosition(QtGui.QTextCursor.Start)
    for i in range(data):
        self.script_cursor.movePosition(QtGui.QTextCursor.Down)

    self.script_cursor.movePosition(QtGui.QTextCursor.EndOfLine)
    self.script_cursor.movePosition(QtGui.QTextCursor.Start, QtGui.QTextCursor.KeepAnchor)
    tmp = self.script_cursor.blockFormat()
    tmp.setBackground(QtGui.QBrush(QtCore.Qt.yellow))
    self.script_cursor.setBlockFormat(tmp)