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)
我有一个 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)