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
相关产品推荐
相关产品推荐

