无法更改可检查QListViewItem的状态,自定义部件
我有一个QListWidget这里我想补充了一堆物品的使用自定义窗口小部件:无法更改可检查QListViewItem的状态,自定义部件
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只是包含一个widget QLabel和一个QPushButton。问题是我无法使用出现在小部件旁边的listwidget中的复选框。它看起来完全正常,但是当我点击它时没有任何反应。如果我使用setItemWidget删除该行,它可以正常工作。我究竟做错了什么?
编辑:在bugreports.qt.io/browse/QTBUG-16386
报告的bug,但得到的回答是“API是不适合你打算做什么”和“在情况下,如果你想显示自定义窗口小部件,使用而QListView和子QItemDelegate。 “所以显然这不是一个错误,只是API无法处理的东西。
我不确定为什么确切的列表项不想改变它的状态,当小部件设置。我猜这个问题的解决方法是在你的小部件中添加一个复选框,或者连接到listwidget的itemClicked信号并在那里重置项目的状态。 PLS,看看下面的例子会为你工作:
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()
希望这会有所帮助,至于
The docs for QListWidget::setItemWidget说:
此功能只能用于显示的地方静态内容列表构件的项目。 如果要显示自定义动态内容或实现自定义编辑器小部件,请改为使用QListView和子类QItemDelegate。
“静态内容”我想这意味着非交互式,表明这是使用QListWidget时的已知限制。
好理论,但复选框(由QListWidgetItem本身创建)不适用于非交互式内容,例如QLabel。 – pafcu 2010-12-29 05:56:10
它在C++中绝对是一样的,所以不仅仅是一个python/pyqt问题(为了看看我能否找到一个解决方案,现在玩了一段时间)。我第一次以为这是Qt :: ItemIsEnabled返回的旧bug,我们已经在4.2中有过,但事实并非如此。
这是要么按照预期工作,并没有足够的说明在文档(我的+1)或一个错误。
为了确保这一点,我会在https://bugreports.qt.io处提交一个错误,看看他们对此有何评论。
报告的bug在http://bugreports.qt.nokia.com/browse/QTBUG-16386,但得到了回复“API不是为你打算做的事情设计的”和“如果你想要显示自定义小部件,请使用QListView和子类QItemDelegate“。所以显然这不是一个错误,只是API无法处理的东西。 – pafcu 2011-01-05 07:36:15
这将作为最后的手段,但我宁愿尽量避免使用这样的解决方法。 – pafcu 2010-12-28 08:25:25