使用QtPropertyBrowser作为高级配置编辑器

时间:2010-11-19 22:07:55

标签: user-interface qt configuration qt4

有没有人使用QtPropertyBrowser作为高级配置编辑器?我只看到GUI示例,编辑GUI元素的属性。但是,如果我想编辑更抽象的东西,比如应用程序配置,我将如何开始。

以下是一个例子:

我正在创建一个具有多页配置对话框的应用程序。一些设置是关于打印机,一些是关于数据库,一些是通用应用程序设置,一些是关于模板文件名和/或模板。但是在编辑器中设计所有这些详细的配置页面之前,我想在对话框中有一个“高级”或“专家”选项卡,其中列出了所有可以想象的配置选项。在设计过程的后期,我会收集越来越多的选项,决定哪些是“简单”选项放入一些更加用户友好的配置页面。谷歌搜索我来到QtPropertyBrowser,似乎是正确的工具。但我不确定如何开始?我很确定,我需要某种抽象配置对象(一个或多个),而不是GUI对象。但我不知道从哪里开始或如何开始。目前我的所有想法都看起来很复杂。

提示的任何建议或指示?

2 个答案:

答案 0 :(得分:10)

您可能希望查看QMetaObject类提供的运行时类型信息。您的数据对象应为QObject的后代,并声明了QOBJECT宏。此外,您还需要一个简单的例程,它将遍历数据对象属性并创建和设置相应的编辑器属性。 Meta对象还提供了用于重置值和方法调用的接口。有关Qt属性系统的更多信息,请访问:The Property System。下面是一个关于如何做到这一点的小例子:

属性浏览器和管理器声明和初始化:

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);
        }
    }
}

答案 1 :(得分:0)

QtPropertyBrowser的示例文件夹中有一个演示版(object_controller),我认为这正是您想要的。虽然该示例显示了类QWidget ObjectController的属性,但在函数setObject (QObject * object);中引用了QObject。请记住,您要检查的所有内容必须直接或间接地继承QObject,即包含有关该类信息的元对象。您了解了Qt中的属性。