QTextEdit查找高亮显示问题解决方案

文章讨论了在QMainWindow的QTextEdit组件中查找关键词导致的应用卡顿问题,提出将查找操作放在子线程中,但由于GUI控件不能在子线程中直接操作,因此设计了一个SearchWorker类在子线程查找,然后在主线程中完成高亮显示,通过信号槽机制协调两个线程间的通信,提高了用户体验。
摘要由CSDN通过智能技术生成

直接在QMainWindow对QTextEdit查找关键词进行高亮显示,发现效果可以达到,但是当要检索的内容比较多的时候,会出现应用卡住的情况,使用体验很不友好。

于是想着放到子线程中来执行,结果发现子线程中无法查找到关键字,查找资料说不能在子线程中操作GUI控件,可以将查找单独封装一个类来执行,在子线程中调用,高亮显示在主线程中完成。

查找类:

class SearchWorker(QObject):
    finished = pyqtSignal(list)

    def find_text(self, document, keyword):
        # 查找匹配项
        matches = []
        if keyword.strip():
            cursor = QTextCursor(document)
            cursor = document.find(keyword, cursor)
            while not cursor.isNull():
                matches.append(cursor)
                cursor = document.find(keyword, cursor)

        self.finished.emit(matches)

子线程:

class SearchThread(QThread):
    def __init__(self, dialog):
        super().__init__()
        self.dialog = dialog

    def run(self):
        keyword = self.dialog.search_box.text()
        document = self.dialog.detail_edit.document()
        self.dialog.detail_edit.moveCursor(QTextCursor.Start)
        self.dialog.search_worker.find_text(document, keyword)

主线程:

class MyDialog(QMainWindow):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        ...

        self.search_count = 0
        self.search_text = ""
        self.search_worker = SearchWorker(self)
        self.search_thread = SearchThread(self)
        self.search_worker.finished.connect(self.handleSearchResult)

    def clearHighlight(self):
        # 清除之前的高亮
        white_format = QTextCharFormat()
        white_format.setBackground(QColor("white"))
        # 选择全部文本
        self.detail_edit.selectAll()
        # 应用QTextCharFormat对象,清除高亮
        self.detail_edit.mergeCurrentCharFormat(white_format)

    def handleSearchResult(self,matches):
        self.search_count = len(matches)
        self.clearHighlight()

        # 设置下一个匹配项的高亮
        yellow_format = QTextCharFormat()
        yellow_format.setBackground(QColor("yellow"))
        for match in matches:
            match.mergeCharFormat(yellow_format)

        cursor = QTextCursor(self.detail_edit.document())
        for match in matches:
            # 将光标定位到第一个匹配项上
            cursor.setPosition(match.position())
            self.detail_edit.setTextCursor(cursor)
            break  # 只需要定位到第一个匹配项即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值