QSyntaxHighlighter 显示问题

QSyntaxHighlighter display issue

我正在为软件中的文档编写搜索栏。 问题是:只有在我手动调整 window 的大小(例如通过拖动一个角)后才会出现高亮显示。

文档在 QTextDocument 中的 html 中,我使用 QSyntaxHighlighter 突出显示所有与搜索栏匹配的单词。

我试图在程序中调整 QMainWindow 和 QWidget 的大小,但没有成功。

from PySide2 import QtCore, QtWidgets, QtGui
import sys


class WindowVocabulary(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.set_ui()

    def set_ui(self):
        self.w = PageHtml('voca.html')
        self.setCentralWidget(self.w)
        #Eléments
        self.dock = QtWidgets.QDockWidget()
        self.dock.setAllowedAreas(QtCore.Qt.TopDockWidgetArea)
        w_dock = QtWidgets.QWidget()
        line = QtWidgets.QLineEdit()
        #Layout
        h = QtWidgets.QHBoxLayout()
        v = QtWidgets.QVBoxLayout()
        v.addWidget(line)
        w_dock.setLayout(v)
        self.dock.setWidget(w_dock)
        self.addDockWidget(QtCore.Qt.TopDockWidgetArea, self.dock)
        #Actions
        line.textChanged.connect(self.w.recherche)


class SearchHighLight(QtGui.QSyntaxHighlighter):
    def __init__(self, doc):
        super().__init__(doc)
        self.m_pattern = QtCore.QRegularExpression()
        self.m_pattern.setPatternOptions(QtCore.QRegularExpression.CaseInsensitiveOption)
        self.m_format = QtGui.QTextCharFormat()
        self.m_format.setBackground(QtCore.Qt.green)

    def highlightBlock(self, text):
        matchIterator = self.m_pattern.globalMatch(text)
        while(matchIterator.hasNext()):
            match = matchIterator.next()
            self.setFormat(match.capturedStart(), match.capturedLength(), self.m_format)

    def searchText(self, text):
        self.m_pattern.setPattern(text);
        self.rehighlight() 


class PageHtml(QtWidgets.QWidget):
    def __init__(self, path):
        super().__init__()
        self.set_ui(path)

    def set_ui(self, path):        
        self.d = QtGui.QTextDocument()
        self.d.setHtml(open(path, encoding="utf-8").read())
        self.m_searchHighLight = SearchHighLight(self.d)

    def paintEvent(self, event):
        p = QtGui.QPainter()
        p.begin(self)
        self.d.drawContents(p)
        p.end()

    def recherche(self, word):
        word = word.replace(' ', '')
        word = word.replace('\n', '')
        if len(word) >= 3 :
            self.m_searchHighLight.searchText(word)


app = QtWidgets.QApplication(sys.argv)
fen = WindowVocabulary()
fen.showMaximized()
sys.exit(app.exec_())

我想要一个实时亮点

你必须调用update()方法来重新绘制小部件,同时建议你传递一个空字符串,以便在必要时清除突出显示。

def recherche(self, word):
    word = word.replace(" ", "").replace("\n", "")
    self.m_searchHighLight.searchText(word if len(word) >= 3 else "")
    self.update()