无法使用自定义窗口小部件更改可检查QListViewItem的状态

时间:2010-12-22 14:47:16

标签: python qt pyqt qlistwidget

我有一个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无法处理的事情。

3 个答案:

答案 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提交一个错误,并看看他们对此有何看法。