QTreeView复选框

时间:2011-11-17 22:12:55

标签: c++ python qt checkbox pyqt

我知道这已被问了很多次,但我似乎无法找到任何相关内容。

使用Qt附带的the simpletreemodel tutorial,如何添加复选框?

4 个答案:

答案 0 :(得分:19)

首先,您需要修改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());
}

并修改模型的flags方法,让视图知道模型包含可检查的项目:

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检查状态,那么您需要在TreeModel中提供QAbstractItemModel :: setData方法。

答案 1 :(得分:15)

为了我自己的目的,我将上面的内容转换为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)

答案 2 :(得分:1)

这是使用QStandardItemModel的另一个PyQt完整的woking示例:



    public Member() {
        this.artists = new ArrayList();
    }

顺便说一下,这应该适用于任何C ++应用程序。

答案 3 :(得分:0)

我只想通过添加setData方法(从@taynaron的Python版本翻译而来)来完成@JediLlama的答案:

bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role) {
    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

    if (index.column() == 0) {
        if (role == Qt::EditRole) {
            return false;
        }
        if (role == Qt::CheckStateRole) {
            item->setCheck(value.toBool());
            emit dataChanged(index, index);
            return true;
        }
    }

    return QAbstractItemModel::setData(index, value, role);
}