在PyQt中更改文本选择QTextEdit

问题描述:

我试图在QTextEdit对象中选择不同的文本。在PyQt中更改文本选择QTextEdit

def get_text_cursor(self): 
    return self.TextEdit.textCursor() 

def get_text_selection(self): 
    cursor = self.get_text_cursor() 
    return cursor.selectionStart(), cursor.selectionEnd() 

def set_text_selection(self, start, end): 
    cursor = self.get_text_cursor() 
    cursor.setPosition(start, end) 
    self.TextEdit.setTextCursor(cursor) 

此代码不能正常工作(get_text_selection不工作)我已经尝试了其他的东西,以及他们不工作的。

这个问题已经被问(但没有真正回答)这里 Select text of textEdit object with QTextCursor, QTextEdit

工作代码,这要归功于ekhumoro

# text cursor functions 
def get_text_cursor(self): 
    return self.TextEdit.textCursor() 

def set_text_cursor_pos(self, value): 
    tc = self.get_text_cursor() 
    tc.setPosition(value, QtGui.QTextCursor.KeepAnchor) 
    self.TextEdit.setTextCursor(tc) 

def get_text_cursor_pos(self): 
    return self.get_text_cursor().position() 

def get_text_selection(self): 
    cursor = self.get_text_cursor() 
    return cursor.selectionStart(), cursor.selectionEnd() 

def set_text_selection(self, start, end): 
    cursor = self.get_text_cursor() 
    cursor.setPosition(start) 
    cursor.setPosition(end, QtGui.QTextCursor.KeepAnchor) 
    self.TextEdit.setTextCursor(cursor) 

您可以在https://github.com/cloudformdesign/SearchTheSky

在行动中看到这个代码对于QTextEdit,选择由当前位置和锚定划分。但令人困惑的是,虽然QTextCursor有一个setPostion方法来设置当前位置,但没有相应的setAnchor方法来设置锚点。所以,你必须有一个特殊的标志来调用setPostion两次:

cursor = self.edit.textCursor() 
    cursor.setPosition(start) 
    cursor.setPosition(end, QtGui.QTextCursor.KeepAnchor) 
    self.TextEdit.setTextCursor(cursor) 
+0

非常感谢!工作就像一个魅力:) – vitiral

我有子类的QPlainTextEdit和包括这些功能来添加文本选择功能。我还在第一次点击时添加了占位符文本删除,并将光标放置在文本中的任何位置。您所要做的就是为占位符删除的第一个输入设置标志。这也适用于QTextEdit。

class MyTextEdit(QtGui.QPlainTextEdit): 

    def __init__(self, parent = None): 

     super(MyTextEdit, self).__init__(parent) 

     self.is_first_input = True 

    def mousePressEvent(self, event): 

     if self.is_first_input: 
      self.selectAll() 
      self.clear() 
      self.is_first_input = False 
     else: 
      pass 

     if event.button() == QtCore.Qt.LeftButton: 

      self.startCursorPosition = event.pos() 
      cursor = self.cursorForPosition(self.startCursorPosition) 
      self.startPosition = cursor.position() 


    def mouseMoveEvent(self, event): 

     if event.button() == QtCore.Qt.NoButton: 
      self.endCursorPosition = event.pos() 
      cursor = self.cursorForPosition(self.endCursorPosition) 
      position = cursor.position() 
      cursor.setPosition(self.startPosition) 
      cursor.setPosition(position, QtGui.QTextCursor.KeepAnchor) 
      self.setTextCursor(cursor) 

    def mouseReleaseEvent(self, event): 

     if event.button() == QtCore.Qt.LeftButton: 

      self.endCursorPosition = event.pos() 
      cursor = self.cursorForPosition(self.endCursorPosition) 
      position = cursor.position() 
      cursor.setPosition(self.startPosition) 
      cursor.setPosition(position, QtGui.QTextCursor.KeepAnchor) 
      self.setTextCursor(cursor)