无法检查QListView的项目

时间:2018-03-09 11:34:55

标签: c++ qt qlistview qcheckbox

我正在开发一个带有QListView的对话框类和一个继承QAbstractListModel的自定义模型。我列表中的项目是带有多个标签的自定义小部件。

我设法通过重新实现模型的data()setData()flags()方法为每个项目显示一个复选框,但是当我运行代码并单击与之关联的复选框时其中一个项目,复选框未显示为已选中(仍未选中)。

这是我的代码:

mymodel.h

class MyModel : public QAbstractListModel
{
    Q_OBJECT

public:
    MyModel(QObject *parent);
    int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE ;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
    Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE ;

    QSet<QPersistentModelIndex> checkedItems;
};

mymodel.cpp

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if(role == Qt::CheckStateRole)
    {
        if(checkedItems.contains(index))
            return Qt::Checked;
        else
            return Qt::Unchecked;
    }

    return QVariant();
}


bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if(role == Qt::CheckStateRole)
    {
        if(value == Qt::Checked)
            checkedItems.insert(index);
        else
            checkedItems.remove(index);

        emit dataChanged(index, index);
    }

    return true;
}


Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
    return QAbstractListModel::flags(index) | Qt::ItemIsUserCheckable;
}

mydelegate.h

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    MyDelegate(QObject* parent = 0) : QStyledItemDelegate(parent) {}
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

mydelegate.cpp

QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    return QSize(400, 120);
}

在mydialog.cpp

的构造函数中
model = new MyModel(this);
ui->list->setModel(model);
ui->list->setItemDelegate(new MyDelegate(this));

我尝试添加标记Qt::ItemIsEnabledQt::ItemIsEditable,但它没有改变任何内容。

到目前为止,我对视图/模型的实现并不是很熟悉,尽管我读过Qt文档。

请求帮助!

1 个答案:

答案 0 :(得分:0)

为了更准确地评论我的评论,这就是我的想法

    bool MyModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if(role == Qt::CheckStateRole)
    {
        if(value == Qt::Checked)
            checkedItems.insert(index);
            self.checkBoxList[index.row()][index.column()].setChecked(True)
        else
            checkedItems.remove(index);
            self.checkBoxList[index.row()][index.column()].setChecked(False)

        emit dataChanged(index, index);
    }

    return true;
}

我只是没有你所有的代码所以我不知道你的self.checkBoxList是如何完成的。是表的checkBox子项吗?