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

标签 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 的小部件。问题是我无法使用出现在小部件旁边的列表小部件中的复选框。它看起来完全正常,但是当我点击它时没有任何反应。如果我删除带有 setItemWidget 的行,它会正常工作。我做错了什么?

编辑:

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

最佳答案

我不确定为什么列表项不想在设置小部件时更改其状态。我想这个问题的解决方法是在您的小部件中添加一个复选框或连接到列表小部件的 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()

希望这对你有帮助,问候

关于python - 无法使用自定义小部件更改可检查 QListViewItem 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510341/

相关文章:

python - 使用 mechanize Python 在文本区域中输入数据

python - Pandas - 用特定组的平均值替换列中的 NaN

c++ - 在使用 Qt Creator 创建一个非常简单的项目时卡在 Qt 中的 "segmentation fault"

qt - 使用 QTcpSocket 的 Tcp 数据包

python - 更改 QTableView 中的默认行大小

python - PyQt:如何在小部件之间传输文本数据?

python - 我如何在 PyQt5 中销毁并重新创建我的窗口?

python - 在制作 boost.python helloword 演示时不安全地使用相对 rpath libboost.dylib?

Python地理空间坐标格式转换

python - 不透明度的 QVariantAnimation : the item appears at the end of the animation