2013-12-23 55 views
1

最近我一直在研究一個PyQt正則表達式測試器,我需要突出顯示匹配的結果。爲什麼QT類QSyntaxHighlighter的highlightBlock(text)方法每次處理一行文本?

這裏是我的代碼:

def highlightBlock(self, text): 
    index = 0 
    length = 0 
    for item in self.highlight_data: 
     index = text.indexOf(item, index + length) 
     length = len(item) 
     self.setFormat(index, length, self.matched_format) 

的self.highlight_data是存儲匹配數據的列表,並且該方法重複文本找到他們,並突出顯示它們。但是當匹配的數據包含'\ n'(多行)時,結果將不會正確突出顯示。

當我調試代碼時,如果文本包含多行,我發現highlightBlock(文本)方法會被多次調用。每次參數文本都是一行數據。

然後,我改變了我的代碼:

def highlightBlock(self, text): 
    index = 0 
    length = 0 
    for item in self.highlight_data: 
     if item.count('\n') != 0: 
      itemList = item.split('\n') 
      for part in itemList: 
       index = text.indexOf(part, index + length) 
       if index == -1: 
        index = 0 
       else: 
        length = len(part) 
        self.setFormat(index, length, self.matched_format) 
     else: 
      index = text.indexOf(item, index + length) 
      length = len(item) 
      self.setFormat(index, length, self.matched_format) 

這將解決這個問題。

這是我的問題:爲什麼highlightBlock(文本)方法每次處理一行?爲什麼不只是將整個文本(包括'\ n')一次而不是一行轉換多次?

回答

1

我想這個線索的名字是:「highlightBlock」。它被稱爲每當文本內的文本更改。

從Qt的文檔引用爲QTextEdit

的段落和字符的QTextEdit工作。一個段落是一個 格式化的字符串,它被字符包裝以適應 小部件的寬度。默認情況下,當閱讀純文本時,一個換行符表示 段落。文檔由零個或多個段落組成。段落中的文字 按照段落的 對齊。段落以強硬換行符分隔。

因此,由於QTextEdit可以處理段落/塊,所以QSyntaxHighlighter應該也是如此。

相關問題