Как я должен связать класс данных с моим кодом GUI (для отображения атрибутов объекта в C ++)? - PullRequest
0 голосов
/ 24 апреля 2009

У меня есть класс (в C ++), назовите его Data, у которого есть тысячи экземпляров (объектов) при запуске кода. У меня есть виджет (в Qt), назовите его DataWidget, который отображает атрибуты объектов. Чтобы быстро создать виджет, я просто записал атрибуты объекта в файл и заставил виджет проанализировать файл на предмет атрибутов - этот подход работает, но не масштабируется и не хорош.

Чтобы быть более понятным, мои требования:
1 - DataWidget должен иметь возможность отображать несколько различных Data атрибутов объекта одновременно
2 - DataWidget должен отображать тысячи Data объектов в секунду
3 - DataWidget должен выполняться вдоль кода, генерирующего новые Data объекты
4 - каждый Data объект должен быть постоянно сохранен в файл / базу данных

В настоящее время создается графический интерфейс пользователя и создается DataWidget, затем выполняется эксперимент и генерируются тысячи объектов Data (периодически записывая некоторые из них в файл). После запуска эксперимента DataWidget отображает последний Data объект, записанный в файл (они записываются в файлы XML).

С моим текущим подходом к файлам я могу удовлетворить (1) , захватив более одного файла после запуска эксперимента. Поскольку эксперимент не привязан к DataWidget, параллелизма нет, поэтому я не могу выполнить (3) , пока не добавлю сигнал, информирующий DataWidget о существовании нового файла.

Я не продвинулся в этом подходе по двум причинам: Во-первых, даже если файлы не сразу записываются на диск, я не могу себе представить, что этот метод является масштабируемым, если I не внедрит систему кэширования - но, похоже, я заново изобрел колесо? Во-вторых, Data - это оболочка для структуры данных графа, и я использую Graphml (через Boost Graph Library, т.е. write_graphml () ), чтобы записать структуру в файлы XML и прочитать структуру обратно в * Boost read_graphml () требует, чтобы я прочитал файл обратно в Data объект ... что означает, что экспериментальная часть программы кодирует объект в XML, записывает XML в файл (но надеюсь, в памяти, а не на диск), тогда DataWidget читает XML из файла и декодирует его в объект!

Мне кажется, что я должен использовать базу данных, которая будет обрабатывать все кэширование и т. Д. Кроме того, похоже, что я должен быть в состоянии пропустить шаг файла / базы данных и передать Data в DataWidget в Программа (возможно, передайте ей ссылку на список Data). Тем не менее, я также хочу сохранить Data в файл, чтобы шаг в файл / базу данных не был совершенно бессмысленным - я просто неправильно его использую в неподходящее время.

Какой подход лучше, учитывая мои требования?

Существуют ли какие-либо общие ресурсы и / или рекомендации для обработки и отображения данных, подобных этой?

Ответы [ 3 ]

1 голос
/ 24 апреля 2009

Если все элементы данных поместятся в памяти, я бы сказал, поместите их в вектор / список и передайте ссылку на это в DataWidget. Когда пришло время их сохранить, передайте ссылку на ваш метод сериализации. Затем ваш эксперимент просто заполняет структуру данных для использования другими процессами.

1 голос
/ 24 апреля 2009

Я вижу, что вы используете Qt. Это хорошо, потому что Qt 4.0 и более поздние версии включают в себя мощную структуру модель / представление. И я думаю, что это то, что вы хотите.

Model / View

По сути, ваш класс Data наследует и реализует QAbstractItemModel или другой класс Qt Model, в зависимости от типа модели, которую вы хотите. Затем настройте свой виджет (скорее всего, QListView) на использование Data для своей модели.

Есть много примеров на их сайте, и это решение прекрасно масштабируется с большими наборами данных.

Добавлено: Код этой модели из labs.trolltech.com очень удобен:

http://labs.trolltech.com/page/Projects/Itemview/Modeltest

1 голос
/ 24 апреля 2009

Мне кажется, что я должен использовать база данных, которая будет обрабатывать все Кроме того, кажется, что я должен быть в состоянии пропустить шаг файла / базы данных и передать данные к DataWidget в программе (возможно, передайте ссылку на список данных). Тем не менее, я также хочу сохранить Данные для файла в файл / шаг базы данных не совсем бессмысленно - я просто используя это неправильно неправильно время.

Если вам нужно отобразить столь быстро меняющиеся данные, наличие промежуточного файла или базы данных замедлит его и, вероятно, станет узким местом. Я думаю, что виджет должен читать вновь сгенерированные данные непосредственно из памяти. Это не мешает вам хранить данные в файле или базе данных, однако, это можно сделать в отдельном потоке / процессе.

...