QML视图在向QAbstractListModel模型添加新项时不会更新

我已经想出如何将从QAbstractListModel派生的模型绑定到QML视图。QML视图在向QAbstractListModel模型添加新项时不会更新

但是,我累了的下一件事是行不通的。如果新模型添加到模型中,QML视图将不会更新。这是为什么?

DataObject.h

class DataObject { 

public:

DataObject(const QString &firstName,

const QString &lastName):

first(firstName),

last(lastName) {}

QString first;

QString last;

};

SimpleListModel.h

class SimpleListModel : public QAbstractListModel 

{

Q_OBJECT

enum /*class*/ Roles {

FIRST_NAME = Qt::UserRole,

LAST_NAME

};

public:

SimpleListModel(QObject *parent=0);

QVariant data(const QModelIndex &index, int role) const;

Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const;

QHash<int, QByteArray> roleNames() const;

void addName(QString firstName, QString lastName);

private:

Q_DISABLE_COPY(SimpleListModel);

QList<DataObject*> m_items;

};

SimpleListModel.cpp

SimpleListModel::SimpleListModel(QObject *parent) : 

QAbstractListModel(parent)

{

DataObject *first = new DataObject(QString("Firstname01"), QString("Lastname01"));

DataObject *second = new DataObject(QString("Firstname02"), QString("Lastname02"));

DataObject *third = new DataObject(QString("Firstname03"), QString("Lastname03"));

m_items.append(first);

m_items.append(second);

m_items.append(third);

}

QHash<int, QByteArray> SimpleListModel::roleNames() const

{

QHash<int, QByteArray> roles;

roles[/*Roles::*/FIRST_NAME] = "firstName";

roles[/*Roles::*/LAST_NAME] = "lastName";

return roles;

}

void SimpleListModel::addName(QString firstName, QString lastName)

{

DataObject *dataObject = new DataObject(firstName, lastName);

m_items.append(dataObject);

emit dataChanged(this->index(m_items.size()), this->index(m_items.size()));

}

int SimpleListModel::rowCount(const QModelIndex &) const

{

return m_items.size();

}

QVariant SimpleListModel::data(const QModelIndex &index, int role) const

{

//--- Return Null variant if index is invalid

if(!index.isValid())

return QVariant();

//--- Check bounds

if(index.row() > (m_items.size() - 1))

return QVariant();

DataObject *dobj = m_items.at(index.row());

switch (role)

{

case /*Roles::*/FIRST_NAME:

return QVariant::fromValue(dobj->first);

case /*Roles::*/LAST_NAME:

return QVariant::fromValue(dobj->last);

default:

return QVariant();

}

}

AppCore.h

class AppCore : public QObject 

{

Q_OBJECT

Q_PROPERTY(SimpleListModel *simpleListModel READ simpleListModel CONSTANT)

public:

explicit AppCore(QObject *parent = 0);

SimpleListModel *simpleListModel() const;

public slots:

void addName();

private:

SimpleListModel *m_SimpleListModel;

};

AppCore.cpp

AppCore::AppCore(QObject *parent) : 

QObject(parent)

{

m_SimpleListModel = new SimpleListModel(this);

}

SimpleListModel *AppCore::simpleListModel() const

{

return m_SimpleListModel;

}

void AppCore::addName()

{

m_SimpleListModel->addName("FirstnameNEW", "LastnameNEW");

}

的main.cpp

int main(int argc, char *argv[]) 

{

QGuiApplication a(argc, argv);

QQuickView *view = new QQuickView();

AppCore *appCore = new AppCore();

qRegisterMetaType<SimpleListModel *>("SimpleListModel");

view->engine()->rootContext()->setContextProperty("appCore", appCore);

view->setSource(QUrl::fromLocalFile("main.qml"));

view->show();

return a.exec();

}

main.qml

// ... 

ListView {

id: myListView

anchors.fill: parent

delegate: myDelegate

model: appCore.simpleListModel

}

MouseArea {

anchors.fill: parent

onClicked: {

appCore.addName()

console.log('rowCount: ' + appCore.simpleListModel.rowCount())

}

}

//...

回答:

你应该调用beginInsertRows和endInsertRows代替发射信号

void SimpleListModel::addName(QString firstName, QString lastName) 

{

DataObject *dataObject = new DataObject(firstName, lastName);

// tell QT what you will be doing

beginInsertRows(ModelIndex(),m_items.size(),m_items.size());

// do it

m_items.append(dataObject);

// tell QT you are done

endInsertRows();

}

的这两个功能上发射所需的所有信号

回答:

你忽略了一个QAbstractItemModel的语义。有两种类型的信号,一个模型必须发出:

  • 数据变化的信号:它们必须发出后的数据被改变。数据变化是现有项目价值的变化。对模型的其他更改是而不是称为数据更改 - 这里的术语具有特定含义。

  • 结构变化的信号:它们必须和之前任何结构变化后射出。结构变化是添加或删除任何项目。帮助功能beginXxxYyyendXxxYyy发出这些信号。

以上是 QML视图在向QAbstractListModel模型添加新项时不会更新 的全部内容, 来源链接: utcz.com/qa/262447.html

回到顶部