Флажки QTreeView - PullRequest
       7

Флажки QTreeView

17 голосов
/ 18 ноября 2011

Я знаю, что об этом спрашивали много раз, но, похоже, я не могу найти что-нибудь подходящее.

Используя простое учебное пособие по модели , поставляемое в комплекте с Qt, как мне добавить флажки?

Ответы [ 3 ]

20 голосов
/ 18 ноября 2011

Во-первых, вам нужно изменить TreeItem, чтобы отслеживать проверенное состояние:

private:
    ...
    bool checked;

и сеттер и геттер:

bool isChecked() const { return checked; }
void setChecked( bool set ) { checked = set; }

Теперь необходимо изменить модель, чтобы представление узнало о состоянии проверки:

QVariant TreeModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

    if ( role == Qt::CheckStateRole && index.column() == 0 )
        return static_cast< int >( item->isChecked() ? Qt::Checked : Qt::Unchecked );

    if (role != Qt::DisplayRole)
        return QVariant();

    return item->data(index.column());
}

и измените метод флагов модели, чтобы представления знали, что модель содержит проверяемые элементы:

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return 0;

    Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;

    if ( index.column() == 0 )
        flags |= Qt::ItemIsUserCheckable;

    return flags;
}

Я думаю, что это должно сделать это. Если вы хотите иметь возможность обновлять состояние проверки TreeItem, когда пользователь выбирает и снимает отметку с элементов, то вам необходимо предоставить метод QAbstractItemModel :: setData в TreeModel.

15 голосов
/ 24 марта 2013

Я преобразовал вышеупомянутое в PyQt для своих собственных целей и решил поделиться.

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

    item = index.internalPointer();

    if role == Qt.CheckStateRole and index.column() == self.check_col:
        return int( Qt.Checked if item.isChecked() else Qt.Unchecked )

    return super(TreeModel, self).data(index, role)


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

    if index.column() == self.check_col:
        flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable
    else:
        flags = super(TreeModel, self).flags(index)

    return flags


def setData(self, index, value, role=Qt.EditRole):
    if index.column() == self.check_col:
        if role == Qt.EditRole:
            return False
        if role == Qt.CheckStateRole:
            item = self.getItem(index)
            item.setChecked(value)
            self.dataChanged.emit(index, index)
            return True

    return super(TreeModel, self).setData(index, value, role)
1 голос
/ 15 апреля 2017

Вот еще один пример полного пробуждения PyQt с использованием QStandardItemModel:

model = QStandardItemModel()
parent_item = model.invisibleRootItem()  # type: QStandardItem
for row in [
    (Qt.Unchecked, 'unchecked'),
    (Qt.PartiallyChecked, 'partially'),
    (Qt.Checked, 'checked')
]:
    checked, text = row
    check_item = QStandardItem('')
    check_item.setCheckable(True)
    check_item.setCheckState(checked)
    parent_item.appendRow([check_item, QStandardItem(text)])
treeview.setModel(model)

Кстати, это также должно работать для любых приложений C ++.

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