接上一篇,在stringlistmodel.h中添加
Qt::ItemFlags flags(const QModelIndex &index) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
在stringlistmodel.cpp中添加:
Qt::ItemFlags MyStringListModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
bool MyStringListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == DescriptionRole)
{
stringList.replace(index.row(), value.toString());
emit dataChanged(index, index);
return true;
}
return false;
}
这里还是贴出全部代码:
stringlistmodel.h
#ifndef STRINGLISTMODEL_H
#define STRINGLISTMODEL_H
#include <QAbstractListModel>
#include <QStringList>
class MyStringListModel : public QAbstractListModel
{
Q_OBJECT
public:
enum {
DescriptionRole = Qt::UserRole,
};
explicit MyStringListModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = DescriptionRole) const override;
virtual QHash<int, QByteArray> roleNames() const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
private:
QStringList stringList;
};
#endif // STRINGLISTMODEL_H
stringlistmodel.cpp文件:
#include "stringlistmodel.h"
MyStringListModel::MyStringListModel(QObject *parent)
{
Q_UNUSED(parent);
stringList.append("111111");
stringList.append("222222");
}
int MyStringListModel::rowCount(const QModelIndex &) const
{
return stringList.count();
}
QVariant MyStringListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= stringList.size())
return QVariant();
if (role == DescriptionRole)
return stringList.at(index.row());
else
return QVariant();
}
QHash<int, QByteArray> MyStringListModel::roleNames() const
{
QHash<int, QByteArray> names;
names[DescriptionRole] = "description";
return names;
}
Qt::ItemFlags MyStringListModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
bool MyStringListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == DescriptionRole)
{
stringList.replace(index.row(), value.toString());
emit dataChanged(index, index);
return true;
}
return false;
}
main.cpp文件:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "stringlistmodel.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<MyStringListModel>("RegStringListModel", 1, 0, "MyStringListModel");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
main.qml文件:
import QtQuick 2.9
import QtQuick.Window 2.2
import RegStringListModel 1.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Frame {
ListView {
implicitWidth: 250
implicitHeight: 250
clip: true
model: MyStringListModel {}
delegate: RowLayout {
width: parent.width
TextField {
text: model.description
onEditingFinished:
{
model.description = text;
console.log("model.description is: ", model.description);
}
Layout.fillWidth : true
}
}
}
}
}
运行效果:
在console.log的输出中可以看到model的数据是有改变的。