gpt4 book ai didi

wpf - 如何在 Qt/C++/QML 中实现类似 WPF 的 MVVM?

转载 作者:行者123 更新时间:2023-12-04 02:12:35 24 4
gpt4 key购买 nike

我正在编写一个概念验证应用程序,这非常简单。基本上,它由一个 UI 组成,其中在 QML ListView 中显示“Note”类型对象的列表。

然后我有几门课是这样的:

#ifndef NOTE_H
#define NOTE_H

#include <string>

using namespace std;
class Note
{
public:
Note(QObject* parent = 0)
: QObject(parent)
{

}

Note(const int id, const string& text)
: _id(id), _text(text)
{
}

int id()
{
return _id;
}

const string text()
{
return _text;
}

void setText(string newText)
{
_text = newText;
}

private:
int _id;
string _text;
};

#endif // NOTE_H

然后是一个存储库:
class NoteRepository : public Repository<Note>
{
public:
NoteRepository();
~NoteRepository();

virtual shared_ptr<Note> getOne(const int id);
virtual const unique_ptr<vector<Note>> getAll();
virtual void add(shared_ptr<Note> item);
private:
map<int, shared_ptr<Note>> _cachedObjects;
};

最后是一个向 QML 公开 Note 的 ViewModel
class MainViewModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<Note> notes READ notes NOTIFY notesChanged)
Q_PROPERTY(int count READ count() NOTIFY countChanged)
public:
MainViewModel(QObject *newParent = 0);
int count();
QQmlListProperty<Note> notes();
signals:
void notesChanged();
void countChanged();
public slots:
private:
std::shared_ptr<UnitOfWork> _unitOfWork;
static void appendNote(QQmlListProperty<Note> *list, Note *note);
QList<Note*> _notes;
};

请不要介意这里有任何 C++ 错误,并注意它们是不完整的,这不是此刻的重点,因为我在学习的过程中不断地适应它。

我苦苦挣扎的一点是,如何将类似列表的对象公开给 QML?要求是此列表必须是动态的,应该能够添加、删除和修改注释的文本。当列表被 C++ 修改时,它也应该通知 UI(信号)。

我尝试了 QQmlListProperty,但想不出将它暴露给 QML 的方法。然后我在另一篇 SO 帖子上阅读了这种类型不能被 QML 修改(??),我偶然发现了 QAbstractItemModel。

无论如何,谁能指出我正确的方向?

最佳答案

接受的答案是正确的,除了一个细节。在 MVVM 中,您会将 ViewModel 暴露给 QML,而不是 Model。

关于wpf - 如何在 Qt/C++/QML 中实现类似 WPF 的 MVVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18648257/

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