Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 使用QtPropertyBrowser作为高级配置编辑器_User Interface_Qt_Configuration_Qt4 - Fatal编程技术网

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

User interface 使用QtPropertyBrowser作为高级配置编辑器,user-interface,qt,configuration,qt4,User Interface,Qt,Configuration,Qt4,是否有人将QtPropertyBrowser用作高级配置编辑器?我所看到的只是一个GUI示例,用来编辑GUI元素的属性。但是如果我想编辑一些更抽象的东西,比如应用程序配置,我该如何开始呢 下面是一个例子: 我正在创建一个具有多页配置对话框的应用程序。有些设置是关于打印机的,有些是关于数据库的,有些是通用应用程序设置,有些是关于模板文件名和/或模板的。但是在编辑器中设计所有这些详细的配置页面之前,我希望在对话框中有一个“高级”或“专家”选项卡,列出所有可以想象的配置选项。在以后的设计过程中,我会收

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

下面是一个例子:

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


有任何建议或提示的指针吗?

您可能希望查看通过类提供的运行时类型信息。您的数据对象应该是
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);
        }
    }
}
void加载属性(QObject*object)
{
_浏览器->清除();
如果(对象)
{
常量QMetaObject*meta=object->metaObject();
qDebug()属性(i);
QVariant value=metaProperty.read(对象);
QtProperty*property=NULL;
qDebug()setValue(属性,value.toDouble());
}
else if(metaProperty.type()==QVariant::String)
{
property=\u stringManager->addProperty(metaProperty.name());
_stringManager->setValue(属性,value.toString());
}
如果(财产)
_浏览器->添加属性(属性);
}
}
}

QtPropertyBrowser
的samples文件夹中有一个演示(
object\u controller
),我想这正是您想要的。尽管该示例显示了类
QWidget
ObjectController
的属性,但它接收函数
setObject(QObject*object)中引用的数据一个
QObject
。请记住,所有要检查的对象都必须直接或间接地继承
QObject
,即包含类信息的元对象。您已经了解了Qt中的属性

这确实是一个很有帮助的例子,简单而强大,足以作为基础+1.