Невозможно изменить состояние проверяемого QListViewItem с помощью пользовательского виджета - PullRequest
5 голосов
/ 22 декабря 2010

У меня есть 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, она работает правильно.Что я делаю не так?

edit:

Сообщил об ошибке на bugreports.qt.io / browse / QTBUG-16386 , но получил ответ«API не предназначен для того, что вы собираетесь делать» и «В случае, если вы хотите отобразить пользовательский виджет, используйте QListView и подкласс QItemDelegate».Очевидно, это не ошибка, просто то, что API не может обработать.

Ответы [ 3 ]

2 голосов
/ 24 декабря 2010

Я не уверен, почему именно элемент списка не хочет менять свое состояние при установке виджета. Я полагаю, что обходным путем для этой проблемы было бы либо добавить флажок в вашем виджете, либо подключиться к сигналу itemClicked listwidget и сбросить там состояние элемента. Просьба посмотреть, подойдет ли вам приведенный ниже пример:

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 голос
/ 29 декабря 2010

Документы для QListWidget :: setItemWidget скажем:

Эта функция должна использоваться только для отображения статического содержимого вместо элемента виджета списка.Если вы хотите отобразить пользовательский динамический контент или реализовать пользовательский виджет редактора, используйте взамен QListView и подкласс QItemDelegate.

Под «статическим содержимым» я полагаю, что это означает неинтерактивный, указывая на то, что это известныйограничение при использовании QListWidget.

0 голосов
/ 31 декабря 2010

Это абсолютно то же самое в C ++, так что это не только проблема с python / pyqt (поэкспериментировал с этим некоторое время, чтобы посмотреть, смогу ли я найти решение).Сначала я подумал, что это старая ошибка с возвращением Qt :: ItemIsEnabled, которая у нас уже была в 4.2, но это не так.

Это либо работает, как задумано, и недостаточно описано в документации (мой +1для этого), или ошибка.

Чтобы быть уверенным в этом, я бы подал ошибку в https://bugreports.qt.io, и посмотрю, что они говорят по этому поводу.

...