You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5中QTextBrowser点击行后无法打印对应文本内容如何解决

PyQt5 QTextBrowser点击行打印内容问题排查修复

核心问题点

  • 自定义的TextBrowser类实例没有被添加到界面上,界面实际显示的是普通QTextBrowser控件code_textBrowser,事件过滤器中调用self.cursorForPosition是针对未显示的自定义类实例,坐标和内容完全不匹配
  • 鼠标事件的坐标是相对于code_textBrowser的视口,直接传给未渲染的自定义类实例无法定位到正确行

修复后可运行代码

import sys
from PyQt5 import QtCore, QtWidgets

class TextBrowser(QtWidgets.QTextBrowser):
    # 直接重写鼠标点击事件,不需要额外安装事件过滤器
    def mousePressEvent(self, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            tc = self.cursorForPosition(event.pos())
            print("text = ", tc.block().text())
        # 保留父类原有事件逻辑
        super().mousePressEvent(event)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi()

    def setupUi(self):
        self.resize(104, 105)
        self.centralwidget = QtWidgets.QWidget(self)
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        # 界面上直接使用自定义的TextBrowser控件
        self.code_textBrowser = TextBrowser(self.centralwidget)
        self.gridLayout.addWidget(self.code_textBrowser, 1, 0, 1, 1)
        self.code_textBrowser.append("ab\ncde\nfghi\njklmn\nopqrstu")
        self.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(self)
        self.setMenuBar(self.menubar)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

修改说明

  • 拆分了自定义控件和主窗口逻辑,避免功能耦合
  • 界面直接使用自定义的TextBrowser实例,重写mousePressEvent直接处理自身的点击事件,坐标和内容完全匹配
  • 保留了父类原有事件逻辑,不会影响QTextBrowser的默认交互功能

内容的提问来源于stack exchange,提问作者Jersey Devil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:54:03