Как создать древовидное представление (с флажком) внутри поля со списком - PyQt - PullRequest
0 голосов
/ 07 марта 2011

Я использую PYQT для разработки приложения. Мое требование - вставить древовидное представление с флажком внутри элементов списка. Я хотел бы знать, как этого добиться?

У меня есть следующий код, но он не работает.

class CheckboxInsideListbox(QWidget):
def __init__(self, parent = None):
    super(CheckboxInsideListbox, self).__init__(parent)
    self.setGeometry(250,250,300,300)
    self.MainUI()

def MainUI(self):
    #stb_label = QLabel("Select STB\'s")
    stb_combobox = QComboBox()

    length = 10
    cb_layout = QVBoxLayout(stb_combobox)
    for i in range(length):
        c = QCheckBox("STB %i" % i)
        cb_layout.addWidget(c)

    main_layout = QVBoxLayout()
    main_layout.addWidget(stb_combobox)
    main_layout.addLayout(cb_layout)



    self.setLayout(main_layout)

Пожалуйста, дайте мне знать, если я что-то здесь упускаю.

Ответы [ 2 ]

0 голосов
/ 13 марта 2011

Вы должны создать модель, которая поддерживает Qt.CheckStateRole в методах data и SetData и флаг Qt.ItemIsUserCheckable в методе flags.

Вставьте здесь пример, который я использую в проекте, этоуниверсальная реализация QSortFilterProxyModel для использования в любой модели, но вы можете использовать те же идеи в реализации вашей модели, очевидно, я использую внутренние структуры в этом подклассе, которых у вас нет непосредственно в PyQt, и они привязаны к моей внутренней реализации (self.booleanSet и self.readOnlySet).

def flags(self, index):
    if not index.isValid():
        return Qt.ItemIsEnabled

    if index.column() in self.booleanSet:
        return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled
    elif index.column() in self.readOnlySet:
        return Qt.ItemIsSelectable | Qt.ItemIsEnabled
    else:
        return QSortFilterProxyModel.flags(self, index)

def data(self, index, role):
    if not index.isValid():
        return QVariant()

    if index.column() in self.booleanSet and role in (Qt.CheckStateRole, Qt.DisplayRole):
        if role == Qt.CheckStateRole:
            value = QVariant(Qt.Checked) if index.data(Qt.EditRole).toBool() else QVariant(Qt.Unchecked)
            return value
        else: #if role == Qt.DisplayRole:
            return QVariant()
    else:
        return QSortFilterProxyModel.data(self, index, role)

def setData(self, index, data, role):
    if not index.isValid():
        return False

    if index.column() in self.booleanSet and role == Qt.CheckStateRole:
        value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False)
        return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole)
    else:
        return QSortFilterProxyModel.setData(self, index, data, role)
0 голосов
/ 11 марта 2011

Если вы действительно хотите применить макет к макету, попробуйте добавить свой виджет в ваш cb_layout.В противном случае избавьтесь от своего подслоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...