C++ 为QML ListView实现QAbstractListModel子类?

C++ 为QML ListView实现QAbstractListModel子类?,c++,qt,qml,C++,Qt,Qml,如何实现QAbstractListModel的data函数,使其返回一些属性,这些属性在QMLListView的委托中可见 对于项目类型,我尝试实现一个QObject子类,该子类具有Q_属性s,但是QAbstractListModel::data返回QVariant,并且QObject*不能转换为QVariant 如何创建一个命名属性对QML可见的QVariant class MyListItem : public QObject { Q_OBJECT Q_PROPERTY(type n

如何实现
QAbstractListModel
data
函数,使其返回一些属性,这些属性在QML
ListView
的委托中可见

对于项目类型,我尝试实现一个
QObject
子类,该子类具有
Q_属性
s,但是
QAbstractListModel::data
返回
QVariant
,并且
QObject*
不能转换为
QVariant

如何创建一个命名属性对QML可见的
QVariant

class MyListItem : public QObject {
  Q_OBJECT
  Q_PROPERTY(type name READ name WRITE set_name NOTIFY nameChanged)
  /*...*/
public:
  MyListItem(QObject* parent, const QString& name) : QObject(parent) {
    set_name(name);
  }
};

class MyList : public QAbstractListModel
{
public:
  MyList(QObject* parent);

  Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

  QVector<MyListItem*> items;
};

Q_INVOKABLE int MyList::rowCount(const QModelIndex &) const {
  return items.size();
}

Q_INVOKABLE QVariant MyList::data(const QModelIndex &index, int) const {
  MyListItem* item = items[index.row()];
  return item; // <--- ERROR
}

如果要将QObject封装在QVariant中,则必须使用
QVariant::fromValue

返回QVariant::fromValue(item);

MWE:

main.cpp

#包括
#包括
#包括
#包括
类MyListItem:公共QObject{
Q_对象
Q_属性(QString name READ name WRITE set_name NOTIFY name changed)
公众:
MyListItem(常量QString&name,QObject*parent=nullptr):QObject(parent),m_name(name){
}
QString name()常量{
返回m_名称;
}
公众时段:
无效集合名称(QString名称){
if(m_name==name)
回来
m_name=名称;
发射名称已更改(m_名称);
}
信号:
无效名称已更改(QString名称);
私人:
QString m_名称;
};
类MyList:公共QabStretchListModel
{
公众:
枚举MyListRoles{
ItemRole=Qt::UserRole+1
};
MyList(QObject*parent=nullptr):QAbstractListModel(parent){}
~MyList(){
qDeleteAll(项目);
items.clear();
}
无效附加(MyListItem*项){
beginInsertRows(QModelIndex(),rowCount(),rowCount());
项目。追加(项目);
endInsertRows();
}
int rowCount(常量QModelIndex&parent=QModelIndex())常量重写{
if(parent.isValid())
返回0;
returnitems.count();
}
QVariant数据(常量QModelIndex&index,int角色)常量覆盖{
如果(!index.isValid())
返回{};
如果(index.row()=rowCount())
返回{};
如果(角色==ItemRole)
返回QVariant::fromValue(items[index.row()]);
返回{};
}
QHash roleNames()常量重写{
返回{ItemRole,“item”};
}
私人:
矢量项;
};
#包括“main.moc”
int main(int argc,char*argv[])
{
#如果QT\u版本setContextProperty(“mylist”和&model);
const-QUrl-url(QStringLiteral(“qrc:/main.qml”);
QObject::connect(&engine),&QQmlApplicationEngine::objectCreated,
&应用程序,[url](QObject*obj,const-quorl和objUrl){
如果(!obj&&url==objUrl)
QCoreApplication::退出(-1);
},Qt::QueuedConnection);
引擎加载(url);
返回app.exec();
}
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    ListView{
        anchors.fill: parent
        model: mylist
        delegate: Text {
            text: model.item.name
        }
    }
}

如果要将QObject封装在QVariant中,则必须使用
QVariant::fromValue

返回QVariant::fromValue(item);

MWE:

main.cpp

#包括
#包括
#包括
#包括
类MyListItem:公共QObject{
Q_对象
Q_属性(QString name READ name WRITE set_name NOTIFY name changed)
公众:
MyListItem(常量QString&name,QObject*parent=nullptr):QObject(parent),m_name(name){
}
QString name()常量{
返回m_名称;
}
公众时段:
无效集合名称(QString名称){
if(m_name==name)
回来
m_name=名称;
发射名称已更改(m_名称);
}
信号:
无效名称已更改(QString名称);
私人:
QString m_名称;
};
类MyList:公共QabStretchListModel
{
公众:
枚举MyListRoles{
ItemRole=Qt::UserRole+1
};
MyList(QObject*parent=nullptr):QAbstractListModel(parent){}
~MyList(){
qDeleteAll(项目);
items.clear();
}
无效附加(MyListItem*项){
beginInsertRows(QModelIndex(),rowCount(),rowCount());
项目。追加(项目);
endInsertRows();
}
int rowCount(常量QModelIndex&parent=QModelIndex())常量重写{
if(parent.isValid())
返回0;
returnitems.count();
}
QVariant数据(常量QModelIndex&index,int角色)常量覆盖{
如果(!index.isValid())
返回{};
如果(index.row()=rowCount())
返回{};
如果(角色==ItemRole)
返回QVariant::fromValue(items[index.row()]);
返回{};
}
QHash roleNames()常量重写{
返回{ItemRole,“item”};
}
私人:
矢量项;
};
#包括“main.moc”
int main(int argc,char*argv[])
{
#如果QT\u版本setContextProperty(“mylist”和&model);
const-QUrl-url(QStringLiteral(“qrc:/main.qml”);
QObject::connect(&engine),&QQmlApplicationEngine::objectCreated,
&应用程序,[url](QObject*obj,const-quorl和objUrl){
如果(!obj&&url==objUrl)
QCoreApplication::退出(-1);
},Qt::QueuedConnection);
引擎加载(url);
返回app.exec();
}
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    ListView{
        anchors.fill: parent
        model: mylist
        delegate: Text {
            text: model.item.name
        }
    }
}

如果可以包含指向QObject的指针,请提供一个和一个QVariant,因此我认为问题是another@eyllanesc:请参阅更新。无法将
QObject*
转换为
QVariant