2013-11-14 141 views
0

我試圖在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

回答

4

在行動中看到這個代碼對於QTextEdit,選擇由當前位置和錨定劃分。但令人困惑的是,雖然QTextCursor有一個setPostion方法來設置當前位置,但沒有相應的setAnchor方法來設置錨點。所以,你必須有一個特殊的標誌來調用setPostion兩次:

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

非常感謝!工作就像一個魅力:) – vitiral

0

我有子類的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)