5

我有一个 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 的小部件。问题是我不能使用出现在小部件旁边的列表小部件中的复选框。它看起来完全正常,但是当我单击它时没有任何反应。如果我使用 setItemWidget 删除该行,它可以正常工作。我究竟做错了什么?

编辑:

在bugreports.qt.io/browse/QTBUG-16386报告了错误,但得到了回复“API 不是为您打算做的事情而设计”和“如果您想显示自定义小部件,请使用 QListView 和子类 QItemDelegate。” 所以显然这不是一个错误,只是 API 无法处理的东西。

4

2 回答 2

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()

希望这会有所帮助,问候

于 2010-12-24T18:53:15.650 回答
1

QListWidget::setItemWidget 的文档说:

此功能仅应用于在列表小部件项的位置显示静态内容。如果要显示自定义动态内容或实现自定义编辑器小部件,请改用 QListView 和子类 QItemDelegate。

我认为“静态内容”是指非交互式,表明这是使用 QListWidget 时的已知限制。

于 2010-12-29T03:55:20.110 回答