无法使用自定义widg更改可检查QListViewItem的状态

2024-09-30 04:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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。”因此很明显这不是一个bug,只是API无法处理的问题。在


Tags: 项目api部件widgetitemqtflagsqlistwidget
3条回答

我不知道为什么当widget被设置时列表项不想改变它的状态。我想解决这个问题的方法可能是在小部件中添加一个复选框,或者连接到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()

希望这对你有帮助,谢谢

在C++中,它是完全相同的,所以不仅是Python/PyQT问题(在这个时间里玩了一段时间,看看我是否能找到解决方案)。我第一次认为这是Qt::ItemIsEnabled的旧bug,我们在4.2中已经有过,但事实并非如此。在

这要么是按预期工作,而且在文档中描述得不够(my+1用于此),要么是一个bug。在

为了确定这一点,我将在https://bugreports.qt.io上提交一个bug,看看他们对此有何评论。在

The docs for QListWidget::setItemWidget说:

This function should only be used to display static content in the place of a list widget item. If you want to display custom dynamic content or implement a custom editor widget, use QListView and subclass QItemDelegate instead.

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

相关问题 更多 >

    热门问题