Использование Qt Model / View с пользовательским интерфейсом, не связанным с таблицами, такими как данные и таблицы? - PullRequest
9 голосов
/ 13 марта 2012

Я читал о фреймворке Model / View в Qt. Я считаю, что это действительно полезно при работе с табличными данными, такими как таблицы из базы данных. Мой вопрос: будет ли это полезно для не табличных данных, таких как список свойств или просто некоторые данные различных типов? Если да, то как мне подойти к нему?

Цель - создать редактор для списка свойств, например данных. Список создается во время выполнения, и элементы бывают разных типов (числа, строки, логические значения и пути к файлам, чтобы назвать несколько). Каждый элемент в основном является парой имя-значение. Имя, тип и ограничения (например, ограничения) для каждого элемента определяются во время компиляции. Они будут собраны во время выполнения в разные списки в зависимости от ввода пользователя. И список элементов может измениться во время сеанса редактирования.

Интерфейс, скорее всего, будет представлять собой комбинацию различных предварительно разработанных виджетов, собранных в соответствии с пользовательским вводом Они не могут быть списком или таблицей.

Также очень ценятся некоторые указатели на шаблон дизайна или примеры. Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Я не вижу проблемы с платформой MVC в QT для этого.

По сути, разница между стандартным отображением таблицы и тем, что вы создаете список, динамически сродни карте:

QMap<QString, QVariant> property_map;

Вы можете сделать:

QList<std::pair<QString, QVariant>> property_list;

, который затем можно использовать для отображения в таблице свойства. Наилучший способ, вероятно, будет:

struct {
   QString prop_name;
   int prop_type;
   QVariant prop_value;
};

QVariant в основном предоставит вам один класс абстракции для хранения данных, и это фактически то, что возвращается функцией data() внутри QAbstractItemModel, которую вы можете переопределить.

Таким образом, вы берете список свойств и сводите его к той же таблице, что и данные, к которой относится база данных.

ИЗМЕНЕНО

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

Что вы можете сделать, так это в своем виджете Display определить макет, например: QGridLayout или другие возможные макеты, а затем добавить в него другие виджеты, используя некоторый набор параметров, что может быть выполнено, но может быть несколько боли.

Другой подход, который вы можете использовать, - поместить все виджеты свойств впереди на пользовательском интерфейсе дисплея и просто включить те, которые вам нужны, а остальные отключить, но это применимо только в том случае, если у вас есть четко определенное ограниченное число предустановок. разработанные виджеты.

2 голосов
/ 13 марта 2012

Я уже давно использую Framework / View Framework и обычно реализую свои собственные модели с бэкэндом, основанным на контейнерах Qt (векторы, списки и т. Д.). Даже если данные в конечном итоге поступают из базы данных, работа с (например, вектором идентификаторов базы данных) может значительно повысить производительность (а иногда это единственный способ, которым вы можете это сделать).

Этот тривиальный пример из документации Qt (см. «Создание пользовательской модели)» - это точка, с которой я начал, и показывает, как использовать QStringList в качестве бэкэнда для пользовательской модели.

После того, как вы определили вашу модель, вы можете определить свои собственные представления, которые будут рисовать упорядоченные виджеты на основе содержимого модели под ними. Когда модель изменится, ваш вид изменится соответственно переставляя виджеты при необходимости. Используя возможности QVariant , вы должны иметь возможность визуализировать правильный виджет для каждого типа данных (например, QSpinBox для float, QComboBox для QStringList и т. Д.) *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...