gpt4 book ai didi

c++ - 将新项目添加到基于 QAbstractListModel 的模型时,QML View 不会更新

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:50 25 4
gpt4 key购买 nike

我已经弄清楚如何将派生自 QAbstractListModel 的模型绑定(bind)到 QML View 。

但是接下来我累了就不行了。如果将新项目添加到模型,QML View 将不会更新。这是为什么?

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();
}

ma​​in.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())
}
}
//...

最佳答案

你应该调用 beginInsertRowsendInsertRows 而不是发出信号

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();

}

这两个函数发出所有需要的信号

关于c++ - 将新项目添加到基于 QAbstractListModel 的模型时,QML View 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21829285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com