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()
我正在为软件中的文档编写搜索栏。 问题是:只有在我手动调整 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()