当悬停在 QLabel 中时,如何临时更改 link 的颜色?

How do I change the color of a link temporarily when hovered in a QLabel?

我想要以下行为:

我试过了,但它使 link 无法使用,并且只有当鼠标位于非常特定的位置时才会发生颜色变化:

from PyQt6.QtWidgets import QLabel, QApplication
from PyQt6.QtGui import QMouseEvent

import sys


class SpecialLinkLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.linkHovered.connect(self.change_link_color)

    def mouseMoveEvent(self, event: QMouseEvent):
        if 'color: #999999' in self.text():
            self.setText(self.text().replace('color: #999999', 'color: #1597BB'))
        return super().mouseMoveEvent(event)

    def change_link_color(self):
        if 'color: #1597BB' in self.text():
            self.setText(self.text().replace('color: #1597BB', 'color: #999999'))


app = QApplication(sys.argv)
special_label = SpecialLinkLabel(
    'Click <a href="https://random.dog/" style="color: #1597BB">here</a> for something special!</a>'
)
special_label.setOpenExternalLinks(True)
special_label.show()
sys.exit(app.exec())

不确定这是否可行。

你已经拥有了。 linkHovered 在发出时传递 URL 你只需要检查它是否包含任何 URL 或者它只是一个空字符串。如果它不是空字符串,则更改颜色,否则将其删除。

from PyQt5.QtWidgets import QLabel, QApplication
from PyQt5.QtGui import QMouseEvent, QCursor
from PyQt5 import QtCore

import sys

class SpecialLinkLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.link_text = 'Click <a href="https://google.com" style="color: {color}">here</a> for something special!</a>'
        self.setText(self.link_text)
        self.linkHovered.connect(self.change_link_color)
    
    def change_link_color(self, link):
        print("Hovered: ", repr(link))
        
        self.setText(self.link_text.format(color="red") if link else self.link_text.format(color="blue"))
        
        if link:
            self.setCursor(QCursor(QtCore.Qt.PointingHandCursor))

        else:
            self.unsetCursor()

app = QApplication(sys.argv)
special_label = SpecialLinkLabel()
special_label.show()
sys.exit(app.exec())