Использование QtPropertyBrowser в качестве расширенного редактора конфигурации - PullRequest
3 голосов
/ 20 ноября 2010

Кто-нибудь использовал QtPropertyBrowser в качестве расширенного редактора конфигурации? Все, что я вижу примеры GUI, чтобы редактировать свойства элементов GUI. Но как начать, если я хочу отредактировать что-то более абстрактное, например, конфигурацию приложения.

Вот пример:

Я создаю приложение, которое имеет многостраничный диалог конфигурации. Некоторые настройки относятся к принтеру, некоторые - к базе данных, некоторые - к общим настройкам приложения, некоторые - к именам шаблонов и / или шаблонам. Но прежде чем создавать все эти подробные страницы конфигурации в редакторе, я бы хотел иметь в диалоговом окне вкладку «Дополнительно» или «Эксперт», в которой перечислены все возможные варианты конфигурации. Позже в процессе проектирования я собираю все больше и больше вариантов, решаю, какие «простые» варианты поместить на несколько более удобных страниц конфигурации. И, поглядывая вокруг, я наткнулся на QtPropertyBrowser, который, кажется, является правильным инструментом. Но я не уверен, как начать? Я почти уверен, что вместо объектов GUI мне нужны какие-то абстрактные объекты конфигурации (один или несколько). Но я не знаю, где или как начать с этого. В настоящее время все мои идеи выглядят сложными.

Есть предложения или указатели на подсказки?

Ответы [ 2 ]

10 голосов
/ 20 ноября 2010

Возможно, вы захотите взглянуть на информацию о типе среды выполнения, доступную через класс QMetaObject.Ваши объекты данных должны быть потомками QObject и иметь объявленный макрос QOBJECT.Также вам понадобится простая подпрограмма, которая будет перебирать свойства объектов данных и создавать и настраивать соответствующие свойства редактора.Мета-объект также предоставляет интерфейс для сброса значений и вызова методов.Более подробная информация о системе свойств Qt находится здесь: Система свойств .Ниже приведен небольшой пример того, как вы могли бы сделать это:

Объявление и инициализация браузера и менеджеров свойств:

QtTreePropertyBrowser       *_browser;
QtIntPropertyManager        *_intManager;
QtDoublePropertyManager     *_doubleManager;
QtStringPropertyManager     *_stringManager;

_intManager = new QtIntPropertyManager();
_doubleManager = new QtDoublePropertyManager();
_stringManager = new QtStringPropertyManager();

_browser = new QtTreePropertyBrowser(ui->centralWidget);

загрузка имен и значений свойств:

void loadProperties(QObject *object)
{
    _browser->clear();
    if (object)
    {
        const QMetaObject *meta = object->metaObject();

        qDebug() << "class : " << meta->className();

        for (int i=0; i<meta->propertyCount(); i++)
        {
            QMetaProperty   metaProperty = meta->property(i);
            QVariant        value = metaProperty.read(object);
            QtProperty      *property = NULL;

            qDebug() << "property : " << metaProperty.name() << " : " << value.toInt();

            if (metaProperty.type() == QVariant::Int)
            {
                property = _intManager->addProperty(metaProperty.name());
                _intManager->setValue(property, value.toInt());
            }
            else if (metaProperty.type() == QVariant::Double)
            {
                property = _doubleManager->addProperty(metaProperty.name());
                _doubleManager->setValue(property, value.toDouble());
            }
            else if (metaProperty.type() == QVariant::String)
            {
                property = _stringManager->addProperty(metaProperty.name());
                _stringManager->setValue(property, value.toString());
            }

            if (property)
                _browser->addProperty(property);
        }
    }
}
0 голосов
/ 20 ноября 2010

В папке примеров QtPropertyBrowser появляется демо (object_controller), которое, я думаю, именно то, что вам нужно. Хотя в примере показаны свойства класса, QWidget ObjectController получает как указано в функции setObject (QObject * object); a QObject. Помните, что все, что вы хотите проверить, должно прямо или косвенно наследовать QObject, то есть мета-объект, содержащий информацию о классе. Вы читаете о свойствах в Qt.

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