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

如何启用富文本QLabel的鼠标追踪?或实现多色文本QLabel

问题解决:富文本QLabel鼠标追踪失效及多色文本替代方案

一、修复富文本QLabel的鼠标追踪问题

当QLabel使用HTML富文本时,内部的QTextDocument会拦截鼠标事件,导致主窗口无法捕获鼠标移动事件。可以通过子类化QLabel并传递鼠标事件解决:

修改代码如下,替换原有的richTextLabel定义:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtGui import QMouseEvent
from PyQt5.QtCore import Qt, QEvent
import sys

# 子类化QLabel,传递鼠标移动事件给父窗口
class RichTextLabel(QLabel):
    def mouseMoveEvent(self, event: QMouseEvent):
        # 将事件传递给主窗口,确保坐标更新
        if self.parent():
            self.parent().mouseMoveEvent(event)
        super().mouseMoveEvent(event)

class testWindow(QMainWindow):
    def __init__(self):
        super(testWindow, self).__init__()

        self.setWindowTitle('QLabel Test')
        self.setMouseTracking(True)
        self.resize(600, 200)

        # 显示鼠标移动事件获取的坐标的标签
        self.coordLabel = QLabel(self)
        self.coordLabel.setText('Mouse at:')
        self.coordLabel.setStyleSheet('''QLabel {background-color:#088;}''')
        self.coordLabel.setGeometry(0, 0, 200, 200)
        self.coordLabel.setMouseTracking(True)

        # 使用子类化的富文本标签
        self.richTextLabel = RichTextLabel(self)
        self.richTextLabel.setText('<font color="red">I\'m red! </font><font color="blue">I\'m blue!</font>')
        self.richTextLabel.setStyleSheet('''QLabel {background-color:#880;}''')
        self.richTextLabel.setTextFormat(Qt.RichText)
        self.richTextLabel.setGeometry(400, 0, 200, 200)
        self.richTextLabel.setMouseTracking(True)

        self.show()

    def mouseMoveEvent(self, event: QMouseEvent) -> None:
        if event.type() == QEvent.MouseMove:
            x, y = event.x(), event.y()
            self.coordLabel.setText('Mouse at: {}, {}'.format(x, y))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = testWindow()
    sys.exit(app.exec_())

二、替代方案:不使用HTML富文本实现多色文本

如果不想依赖HTML富文本,可以通过子类化QLabel并重写paintEvent手动绘制多色文本,这种方式不会影响鼠标追踪:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtGui import QMouseEvent, QPainter, QColor
from PyQt5.QtCore import Qt, QEvent
import sys

# 自定义多色文本标签
class ColorTextLabel(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        # 定义文本片段及对应颜色
        self.text_segments = [
            ("I'm red!", Qt.red),
            ("I'm blue!", Qt.blue)
        ]
        self.setStyleSheet('''QLabel {background-color:#880;}''')

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        
        # 绘制背景
        painter.fillRect(self.rect(), QColor("#880"))
        
        # 计算文本起始位置(居中垂直)
        y_pos = self.rect().center().y() + painter.fontMetrics().ascent() // 2
        x_pos = 10  # 水平起始偏移
        
        # 逐个绘制文本片段
        for text, color in self.text_segments:
            painter.setPen(color)
            painter.drawText(x_pos, y_pos, text)
            # 更新水平位置,添加间距
            x_pos += painter.fontMetrics().width(text) + 5

class testWindow(QMainWindow):
    def __init__(self):
        super(testWindow, self).__init__()

        self.setWindowTitle('QLabel Test')
        self.setMouseTracking(True)
        self.resize(600, 200)

        # 显示鼠标移动事件获取的坐标的标签
        self.coordLabel = QLabel(self)
        self.coordLabel.setText('Mouse at:')
        self.coordLabel.setStyleSheet('''QLabel {background-color:#088;}''')
        self.coordLabel.setGeometry(0, 0, 200, 200)
        self.coordLabel.setMouseTracking(True)

        # 使用自定义多色文本标签
        self.colorTextLabel = ColorTextLabel(self)
        self.colorTextLabel.setGeometry(400, 0, 200, 200)
        self.colorTextLabel.setMouseTracking(True)

        self.show()

    def mouseMoveEvent(self, event: QMouseEvent) -> None:
        if event.type() == QEvent.MouseMove:
            x, y = event.x(), event.y()
            self.coordLabel.setText('Mouse at: {}, {}'.format(x, y))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = testWindow()
    sys.exit(app.exec_())

说明

  • 方案一保留了HTML富文本的灵活性,同时解决了鼠标事件传递问题;
  • 方案二完全自定义绘制,避免了富文本的事件拦截问题,适合对文本样式有更精细控制的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:22:35