Как я должен связать класс данных с моим графическим интерфейсом (для отображения атрибутов объекта на C ++)?

StackOverflow https://stackoverflow.com/questions/786182

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Модель/Вид

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

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

Добавлен:Этот тестовый код модели с сайта labs.trolltech.com очень удобен:

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top