如何应用和查看用户角色?

时间:2019-07-01 19:34:13

标签: qt qt5

我正在尝试创建自定义模型,并希望其与自定义角色一起使用。但是我真的不明白该怎么做。另外,我想将我的模型与qt小部件一起使用,而不是与QML View一起使用。角色如何应用于某些项目? 如何设置ListView,以便可以与我的自定义角色一起使用?

我知道我需要创建枚举,并重新实现roleNames函数

我的模型.h文件

class ListModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)

public:

    ListModel();
    virtual ~ListModel() override;

    enum CustomRoles{

        RoleType=Qt::UserRole+1,
        ButtonRole,
        CheckboxRole,

    };

protected:
    QList<BaseItems*> itemList;
    QHash<int, QByteArray> _roles;
   // int _RowCount = 0;

public:
    void Add(BaseItems* item);
    BaseItems* getItem(int index);
    void clear();
    int count() const;

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

Q_SIGNALS:
    void countChanged();
};

我的模型.cpp文件

ListModel::ListModel() : QAbstractListModel()
{


}

ListModel::~ListModel()
{
    itemList.clear();
}


void ListModel::Add(BaseItems *item)
{
    beginInsertRows(QModelIndex(),itemList.count(),itemList.count());
    itemList.append(item);
    endInsertRows();
    Q_EMIT countChanged();

}

BaseItems* ListModel::getItem(int index)
{
    return itemList.at(index);
}


void ListModel::clear()
{
    qDeleteAll(itemList);
    itemList.clear();
}


int ListModel::count() const
{
    return rowCount();
}


int ListModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)
    return itemList.count();
}


QVariant ListModel::data(const QModelIndex &index, int role) const
{
     ItemButton *button = dynamic_cast<ItemButton*>(itemList.at(index.row()));

    if (!index.isValid())
            return QVariant();

    if (index.row() >= itemList.count())
            return QVariant();

    switch (role)
    {

    case Qt::DisplayRole:{
        return QVariant::fromValue(button->Text);}

    case ButtonRole:{
        return QVariant::fromValue(button->Text);}
    }

    return QVariant();
}

QHash<int, QByteArray> ListModel::roleNames() const {

    QHash<int, QByteArray> role;
    role[RoleType] = "first";
    role[ButtonRole] = "last";
    return role;

}

1 个答案:

答案 0 :(得分:0)

您可以有效地命名角色,而不是“第一”和“最后”:

QHash<int, QByteArray> ListModel::roleNames() const {
    QHash<int, QByteArray> role;
    role[RoleType] = "roleType";
    role[ButtonRole] = "buttonRole";
    return role;
}

因此将使用这些引用的名称。如果要在QML中显示此模型中的数据,可以执行以下操作:

ListView {
    width: 100
    height: 500
    model: listModel
    delegate: Text {
        text: model.roleType + model.buttonRole
    }
}

listModel对象可以在C ++中初始化,并且可以使用

传递给QML。
view->rootContext()->setContextProperty("listModel", listModel);

或者您可以在QML中创建ListModel的实例,但是在cpp文件中,您将必须注册ListModel类型

qmlRegisterType<ListModel>("ListModel", 1, 0, "ListModel");

然后在qml文件中:

import ListModel 1.0

最终通过以下方式创建模型的实例

ListModel {
    id: listModel
}