下面是一个使用Qt的MVC模式的样例代码:
model.h
#include <QAbstractListModel>
#include <QStringList>
class Model : public QAbstractListModel
{
Q_OBJECT
public:
explicit Model(QObject *parent = nullptr);
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;
private:
QStringList m_items;
};
model.cpp
#include "model.h"
Model::Model(QObject *parent)
: QAbstractListModel(parent)
{
m_items << "apple" << "banana" << "cherry" << "date" << "elderberry";
}
int Model::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return m_items.count();
}
QVariant Model::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole || role == Qt::EditRole)
return m_items.at(index.row());
return QVariant();
}
QHash<int, QByteArray> Model::roleNames() const
{
QHash<int, QByteArray> roles;
roles[Qt::DisplayRole] = "display";
roles[Qt::EditRole] = "edit";
return roles;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "model.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<Model>("com.example.model", 1, 0, "ListModel");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
main.qml
import QtQuick 2.12
import QtQuick.Controls 2.12
import com.example.model 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: "MVC Example"
ListModel {
id: model
}
ListView {
anchors.fill: parent
model: model
delegate: Text {
text: display
}
}
Button {
text: "Add Item"
onClicked: {
model.append({"display": "new item", "edit": "new item"})
}
}
Button {
text: "Remove Item"
onClicked: {
var index = Math.floor(Math.random() * model.count)
model.remove(index)
}
}
}
此样例代码创建了一个简单的字符串列表模型,允许添加或删除项目,并通过QML界面显示。它演示了如何使用Qt的MVC模式以及如何在QML中使用自定义模型类。