PyQt5文本编辑器Tooltip异常:鼠标移入内容区消失、长文本占满屏
解决PyQt5文本编辑器Tooltip过长的显示问题
问题描述
我开发了一款简单的文本编辑器,当鼠标悬停在单词上时,tooltips字典中定义的Tooltip文本可正常显示。但存在以下问题:
- 当Tooltip文本过长时,其显示位置与鼠标光标重合,导致提示框仅能显示1秒;
- 部分Tooltip甚至会铺满整个屏幕。
解决方案
1. 调整Tooltip显示位置
将Tooltip的显示位置从文本光标位置改为基于鼠标事件位置的偏移,避免鼠标光标覆盖Tooltip。比如在鼠标位置的右下方偏移固定像素,确保Tooltip不会被鼠标遮挡。
2. 限制Tooltip的尺寸
通过QToolTip的样式表设置最大宽度和最大高度,同时开启自动换行,防止过长文本铺满屏幕,超出尺寸的内容会自动适配显示。
修改后的完整代码
import sys from PyQt5.QtWidgets import QTextEdit, QApplication, QMainWindow, QToolTip from PyQt5.QtGui import QTextCursor from PyQt5.QtCore import Qt tooltips = {'Hello': ('Tooltip for Hello' * 20 + '\n') * 100 } class MainWindow(QMainWindow): def __init__(self): super().__init__() # 设置Tooltip样式,限制最大尺寸并开启自动换行 QToolTip.setStyleSheet(""" QToolTip { max-width: 400px; max-height: 300px; border: 1px solid #ccc; background-color: #ffffe0; padding: 5px; word-wrap: break-word; } """) self.text_edit = MyTextEdit("Hello") self.setCentralWidget(self.text_edit) self.resize(800, 600) class MyTextEdit(QTextEdit): def __init__(self, text): super().__init__(text) # 开启鼠标追踪,确保mouseMoveEvent持续触发 self.setMouseTracking(True) def mouseMoveEvent(self, event): tc = self.textCursor() tc_temp = self.cursorForPosition(event.pos()) tc_temp.select(QTextCursor.WordUnderCursor) word = tc_temp.selectedText() if word in tooltips: self.show_tooltip(tooltips[word], event.pos()) else: QToolTip.hideText() self.setTextCursor(tc) super().mouseMoveEvent(event) def show_tooltip(self, tooltip_text, mouse_pos): # 基于鼠标位置偏移显示Tooltip,避免与光标重合 offset = Qt.QPoint(10, 10) global_pos = self.mapToGlobal(mouse_pos + offset) QToolTip.showText(global_pos, tooltip_text) app = QApplication(sys.argv) win = MainWindow() win.show() app.exec_()
关键修改说明
- 在
MainWindow初始化中添加Tooltip样式表,通过max-width、max-height限制尺寸,word-wrap实现自动换行; - 修改
show_tooltip方法,基于鼠标事件位置添加偏移量计算全局显示位置,彻底避免Tooltip与鼠标光标重叠; - 给
MyTextEdit开启setMouseTracking(True),确保鼠标移动时持续触发事件,Tooltip显示更稳定。
内容的提问来源于stack exchange,提问作者lilson
相关产品推荐
相关产品推荐

