Я начинаю изучать QT, и мне нужна помощь с структурированием моего приложения. Идея состоит в том, чтобы управлять всеми данными в одном месте, чтобы я мог легко сохранить/загрузить все - или определенные детали - один раз.class EntryData
{
public:
explicit EntryData();
QString name() const;
void setName(const QString& name);
private:
QString m_fullName;
};
// Serialization
QDataStream &operator(QDataStream& in, EntryData& data);
< /code>
class TodoListModel : public QAbstractListModel
{
Q_OBJECT
public:
enum EntryRoles {
FullNameRole
};
explicit TodoListModel(QObject* parent = nullptr);
~TodoListModel();
Q_INVOKABLE void add(const QString& name);
Q_INVOKABLE void insertAt(const QString& name, int row);
Q_INVOKABLE void removeAt(int row, int count = 1);
// ~ Begin QAbstractListModel interface
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
// ~ End QAbstractListModel interface
const QVector& entries() const;
protected:
// ~ Begin QAbstractListModel interface
QHash roleNames() const override;
// ~ End QAbstractListModel interface
private:
QVector m_entryList;
signals:
void rowCountChanged();
};
< /code>
I also want to implement methods to save/load the data, as well as track the loading state:
class TodoListModel;
class DataManager : public QObject
{
Q_OBJECT
Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged)
private:
explicit DataManager(QObject *parent = nullptr);
public:
static QObject* createInstance(QQmlEngine* engine, QJSEngine* scriptEngine);
Q_INVOKABLE void save(const QString& path);
Q_INVOKABLE bool load(const QString& path);
Q_INVOKABLE void setModel(TodoListModel* model);
bool isLoading() const;
private:
void emitLoading(bool value);
private:
static DataManager* s_instance;
TodoListModel* m_model = nullptr;
//UserSettingsModel* m_userSettings = nullptr;
bool m_isLoading = false;
signals:
void loadingChanged();
};
< /code>
and here is the example implementation of save function:
void DataManager::save(const QString &path)
{
if (m_isLoading) {
return;
}
emitLoading(true);
// Async save all data
(void)QtConcurrent::run([this, path]() {
QFile file(path);
if (!file.open(QIODevice::WriteOnly) || m_model == nullptr) {
emitLoading(false);
return;
}
QDataStream out(&file);
out entries();
file.close();
emitLoading(false);
});
}
< /code>
My question is: Is this a good approach? I'm looking for best practices or patterns for managing data in a Qt app, but I haven’t found much documentation or examples.
Any guidance or suggestions would be appreciated!
Подробнее здесь: https://stackoverflow.com/questions/797 ... -singleton
Лучшая практика для глобальной обработки данных с использованием синглтона? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Символ глобальной карты не «видим»: как поделиться глобальной картой из общей библиотеки?
Anonymous » » в форуме C++ - 0 Ответы
- 34 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Символ глобальной карты не «видим»: как поделиться глобальной картой из общей библиотеки?
Anonymous » » в форуме C++ - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-
-
-
CHATGPT Hallucinations на IF -заявлениях и инициализации синглтона с использованием ленивого
?
Anonymous » » в форуме C# - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-