我正在尝试创建自定义模型,并希望其与自定义角色一起使用。但是我真的不明白该怎么做。另外,我想将我的模型与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;
}
答案 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
}