Я смотрел тонны видео и проводил много времени, читая статьи о моделях, о том, как работать с ними и общая идея, совершенно ясна. Тем не менее, я все еще не получаю несколько вещей, которые меня действительно мешают.Qt Model/View: как правильно обрабатывать базовые данные
Я понимаю, что модель работает только как интерфейс между представлением и данными. Однако, когда я смотрю на примеры кода, большую часть времени на модель отправляется какая-то структура данных, и все функции в модели используют эту внутреннюю структуру данных модели для выполнения необходимых действий: оценивают заголовки, количество строк и т. Д. Пример таких конструктор (в этом случае внутренняя модель QList является addressBook
):
AddressbookModel::AddressbookModel(const QString& addresses,
QObject *parent): QAbstractTableModel(parent)
{
QStringList records = addresses.split(’\n’);
QStringList line;
foreach(QString record, records)
addressBook.append(splitCSVLine(record));
}
И это выглядит нормально, но это становится очень запутанным, когда я пытаюсь думать об изменении исходных данных, где некоторые еще в программе, когда какой-то модели «привязан» к этой структуре данных.
Например, давайте посмотрим на этот пример кода из учебного материала:
// addressbook/main.cpp
#include <QtGui>
#include "addressbookmodel.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QFile file("addressbook.csv");
if (!file.open(QIODevice::ReadOnly|QIODevice::Text))
return 1;
QString addresses = QString::fromUtf8(file.readAll());
AddressbookModel model(addresses);
QTableView tableView;
tableView.setModel(&model);
tableView.show();
return app.exec();
}
Здесь есть статическая переменная addresses
, которая затем отправляется в model
. Теперь пользователь сможет просматривать и изменять эти данные. Но что, если я хочу больше работать с этими данными в другом месте программы? Что делать, если я вставляю новые записи в addresses
? Я понимаю, что модель не увидит эти изменения, и в этом примере (и во многих других), что базовая структура данных даже отправляется не как указатель.
Так что мой вопрос: как правильно управлять данными, когда у меня будут новые данные, поступающие из «за кулисами» - не только из модели? Должен ли я работать с управлением данными только в классе модели (реализовать требуемые функции и т. Д.)? Должен ли я каким-то образом передавать только указатели данных на модель? Все становится еще более сложным, когда я думаю об использовании прокси-моделей для фильтрации, потому что они также работают и несколько «обрабатывают» данные по-своему. Возможно, я пропустил что-то важное в этой архитектуре, но меня это действительно останавливает.
Вы должны начать здесь: http://doc.qt.io/qt-5/model-view-programming.html –
Хорошо, я попытаюсь взглянуть на эту страницу. Хотя я думаю, что видел многих из них, но этот выглядит шире. – rofl