我有一个QListWidget,我想用自定义小部件添加一堆项目:
listWidget = QListWidget()
item = QListWidgetItem()
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(Qt.Unchecked)
listWidget.addItem(item)
widget = MyLabelAndPushButton()
item.setSizeHint(widget.sizeHint())
listWidget.setItemWidget(item, widget)
顾名思义MyLabelAndPushButton只是一个包含布局中的QLabel和QPushButton的小部件。问题是我无法使用窗口小部件旁边的listwidget中显示的复选框。它看起来完全正常,但是当我点击它时没有任何反应。如果我用setItemWidget删除该行,它可以正常工作。我做错了什么?
修改
在bugreports.qt.io/browse/QTBUG-16386报告了错误,但得到了回复“API不是为您打算做的而设计的”和“如果您想要显示自定义窗口小部件,请使用QListView和子类QItemDelegate”。显然,这不是一个错误,只是API无法处理的事情。
答案 0 :(得分:2)
我不确定为什么确切列表项在设置窗口小部件时不想更改其状态。我想这个问题的解决方法是在小部件中添加一个复选框,或者连接到listwidget的itemClicked信号并重置项目状态。请参阅下面的示例是否适用于您:
import sys
from PyQt4 import QtGui, QtCore
class MainForm(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
listWidget = QtGui.QListWidget()
item = QtGui.QListWidgetItem()
item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
item.setCheckState(QtCore.Qt.Unchecked)
listWidget.addItem(item)
widget = QtGui.QCheckBox('test')
item.setSizeHint(widget.sizeHint())
listWidget.setItemWidget(item, widget)
listWidget.itemClicked.connect(self.on_listWidget_itemClicked)
self.setCentralWidget(listWidget)
def on_listWidget_itemClicked(self, item):
if item.listWidget().itemWidget(item) != None:
if item.checkState() == QtCore.Qt.Checked:
item.setCheckState(QtCore.Qt.Unchecked)
else:
item.setCheckState(QtCore.Qt.Checked)
def main():
app = QtGui.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()
if __name__ == '__main__':
main()
希望这有帮助,尊重
答案 1 :(得分:1)
The docs for QListWidget::setItemWidget说:
此功能仅用于在列表小部件项目的位置显示静态内容。 如果要显示自定义动态内容或实现自定义编辑器窗口小部件,请改用QListView和子类QItemDelegate。
通过“静态内容”我认为它意味着非交互式,表明这是使用QListWidget时的已知限制。
答案 2 :(得分:0)
在C ++中它是完全相同的,所以不仅是python / pyqt问题(现在已经玩了一段时间,看看我是否能找到解决方案)。我首先想到这是Qt :: ItemIsEnabled的旧bug,我们已经在4.2中找到了它,但事实并非如此。
这可能是按预期工作,但文档中没有描述(我的+1为此),或者是错误。
为了确定这一点,我会在https://bugreports.qt.io提交一个错误,并看看他们对此有何看法。