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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:17:40