QListWidget.itemClicked 不能可靠地处理带样式的项目

QListWidget.itemClicked doesn't work reliably with styled items

我有一个 QListWidget 包含一个项目,我希望该项目的文本部分加粗,所以我为它创建了一个 QItemWidget。我在里面用了一个QLabel来显示部分加粗的文字,代码如下:

ItemWidget.py

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QHBoxLayout, QLayout, QLabel


class ItemWidget(QtWidgets.QWidget):

    def __init__(self):
        super(ItemWidget, self).__init__()
        self.setLayout(self.__get_layout())

    def __get_layout(self) -> QHBoxLayout:
        label = QLabel("<b>bold</b> texts")
        widget_layout = QHBoxLayout()
        widget_layout.addWidget(label)
        widget_layout.setSizeConstraint(QLayout.SetFixedSize)
        widget_layout.setContentsMargins(0, 0, 0, 0)
        return widget_layout

Main.py

from PyQt5.QtWidgets import QListWidget, QWidget, QVBoxLayout, QApplication, QListWidgetItem

from ItemWidget import ItemWidget


class Window(QWidget):

    def __init__(self):
        super().__init__()

        list_widget = QListWidget()
        list_widget.itemClicked.connect(self.on_item_clicked)
        vbox = QVBoxLayout()
        vbox.addWidget(list_widget)

        item_widget = ItemWidget()
        item = QListWidgetItem()
        list_widget.addItem(item)
        list_widget.setItemWidget(item, item_widget)

        self.setLayout(vbox)

    def on_item_clicked(self):
        print("Item clicked")


app = QApplication([])
window = Window()
window.show()
app.exec_()

这是UI:

当我单击列表中的项目时,Item clicked 应该打印到输出控制台。但问题是,它只有在我不点击文本时才有效:

如果我给ItemWidget中的QLabel一个纯文本,比如label = QLabel("text"),问题似乎就消失了,为什么?这里有什么问题?

设置富文本内容会导致鼠标按钮释放事件始终被接受(我想这是因为富文本可以包含链接)。

视图必须接收鼠标释放事件才能调用其 mouseReleaseEvent() 并最终发出 clicked 信号,但由于该事件已被标签接受,因此不会发生这种情况.

如果您不需要该文本中的链接,只需重置文本交互标志:

    label.setTextInteractionFlags(Qt.NoTextInteraction)