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 を含む単なるウィジェットです。問題は、ウィジェットの横にある listwidget に表示されるチェックボックスを使用できないことです。それは完全に正常に見えますが、クリックしても何も起こりません。setItemWidget で行を削除すると、正しく機能します。私は何を間違っていますか?

編集:

bugreports.qt.io/browse/QTBUG-16386でバグを報告しましたが、「API は意図したとおりに設計されていません」と「カスタム ウィジェットを表示する場合は、QListView とサブクラス QItemDelegate を使用してください」という返信がありました。どうやらこれはバグではなく、API が処理できないものです。

4

2 に答える 2

2

ウィジェットが設定されているときに、リストアイテムがその状態を変更したくない理由がわかりません。この問題の回避策は、ウィジェットにチェックボックスを追加するか、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()

これがお役に立てば幸いです

于 2010-12-24T18:53:15.650 に答える
1

QListWidget::setItemWidget のドキュメントには次のように書かれています。

この関数は、リスト ウィジェット アイテムの代わりに静的コンテンツを表示する場合にのみ使用してください。カスタム動的コンテンツを表示したり、カスタム エディター ウィジェットを実装したい場合は、代わりに QListView とサブクラス QItemDelegate を使用してください。

「静的コンテンツ」とは、非インタラクティブを意味すると思います。これは、QListWidget を使用する場合の既知の制限であることを示しています。

于 2010-12-29T03:55:20.110 に答える