赞
踩
在Qt中已经有这个控件相关的文件了,只要在.pro 中导入就可以了
具体步骤:
1.创建新工程propertyBrowser
2.在Qt的安装目录中搜索qttreepropertybrowser,找到qttreepropertybrowser.pri所在的路径,使用以下命令
// propertyBrowser.pro
include (D:/Qt/Qt_Creator_5.9.2/5.9.2/Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri)
3.重新构建即可
可以看到,工程中已经出现qttreepropertybrowser了。
//widget.h
QtTreePropertyBrowser *browser;
需要添加头文件
#include <qttreepropertybrowser.h>
//.cpp
// browser 初始化
browser = new QtTreePropertyBrowser();
browser->show();
运行:
得到一个空架子,但是它飘在主窗口之外,需要给它加一个父容器限制其位置。
// 这个this指向当前窗口
browser = new QtTreePropertyBrowser(this);
//browser->show();//可以不要
有了父容器限制,但是其大小也随之固定了。要想让其随父容器改变而改变,则需要给它加一个布局限制。
//widget.h
QVBoxLayout *layout;
//widget.cpp
// 布局,放最后
layout = new QVBoxLayout();
layout->addWidget(browser);
layout->setMargin(0);
setLayout(layout);
善。
1.所有属性都必须通过管理器(Manager)添加,不同类型的属性有不同类型的管理器。
2.管理器只管加,不管改。
3.如果要对创造出来的属性进行值的修改,必须借助加工工厂(Factory),工厂同样有不同类型,来对应管理器。
先从常用的属性来看:
int,double,bool,string都是常用的类型,他们对应的Manager有:
QtIntPropertyManager,QtDoublePropertyManager,QtBoolPropertyManager,QtStringPropertyManager.
链接: QtAbstractPropertyManager .
虽然一对一很好,不过在创造数据项的时候,可能没有必要全都用。
还好Variant是个很方便的类型,可以包括以上的类型,而且QtVariantPropertyManager也是存在的,可以用来添加以上这些类型的属性。
声明:
//.h
// variant管理器声明
QtVariantPropertyManager *varManager;
//属性声明
QtVariantProperty *item;
需要添加头文件:
#include <qtvariantproperty.h>
初始化:
// variant管理器初始化
varManager = new QtVariantPropertyManager();
//属性初始化,通过varManager来初始化,其类型为QVariant::Int,其名为INT
item = varManager->addProperty(QVariant::Int, QString("INT"));
//设置属性的值
item->setValue(12);
//将这一条值加到browser之中
browser->addProperty(item);
第一条属性已经添加好了。但是只能看,不能改,需要为管理器(Manager)添加工厂(Factory)
// variant工厂声明
QtVariantEditorFactory *varFactory;
// 初始化
varFactory = new QtVariantEditorFactory();
// 为管理器设置工厂
browser->setFactoryForManager(varManager,varFactory);
值已经可以修改了。
同理,可以添加其他的属性:
// 其他属性
item = varManager->addProperty(QVariant::Bool,QString("BOOL"));
item->setValue(false);
browser->addProperty(item);
item = varManager->addProperty(QVariant::Double,QString("DOUBLE"));
item->setValue(10.23);
browser->addProperty(item);
item = varManager->addProperty(QVariant::String,QString("STRING"));
item->setValue("ABC");
browser->addProperty(item);
这些属性都是可修改的,因为管理器一旦设置了工厂,之后经由该管理器添加的值都是可变的。
常用的基本类型可以像上面的一样添加。但是,另外一种常见的枚举类型却要用别的管理器来添加。
// 枚举管理器和工厂的声明
QtEnumPropertyManager *enumManager;
QtEnumEditorFactory *enumFactory;
需要头文件:
#include <qtpropertymanager.h>
#include <qteditorfactory.h>
(PS.这些头文件管辖范围和命名规则有点混乱哈~)
枚举值不能用上面的item属性了。
// 声明一个枚举属性,表示颜色
QtProperty *colorType;
初始化:
// 枚举管理器和工厂初始化
enumManager = new QtEnumPropertyManager();
enumFactory = new QtEnumEditorFactory();
// 为枚举管理器设置工厂
browser->setFactoryForManager(enumManager,enumFactory);
// 初始化,通过enumManager来初始化,给它一个名字“COLOR”
colorType = enumManager->addProperty("COLOR");
//这里是将枚举类型装在一个QStringList里
QStringList colors;
colors<<"Red"<<"Green"<<"Blue";
//枚举管理器添加枚举值
enumManager->setEnumNames(colorType,colors);
//添加默认值,如果不写,自动选择0位的值
enumManager->setValue(colorType,1);
//将这一条值加到browser之中
browser->addProperty(colorType);
到这里为止就是一个很有用的属性表了。
参考资料:
链接: The Property Browser Framework.
附录:完整代码
// widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <qttreepropertybrowser.h> #include <qtvariantproperty.h> #include <qtpropertymanager.h> #include <qteditorfactory.h> #include <QVBoxLayout> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void createBrowser(); private: Ui::Widget *ui; QtTreePropertyBrowser *browser; QtVariantPropertyManager *varManager; QtVariantEditorFactory *varFactory; QtEnumPropertyManager *enumManager; QtEnumEditorFactory *enumFactory; QtVariantProperty *item; QtProperty *colorType; QVBoxLayout *layout; }; #endif // WIDGET_H
// widget.cpp #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); createBrowser(); } Widget::~Widget() { delete ui; } void Widget::createBrowser() { browser = new QtTreePropertyBrowser(this); varManager = new QtVariantPropertyManager(); varFactory = new QtVariantEditorFactory(); enumManager = new QtEnumPropertyManager(); enumFactory = new QtEnumEditorFactory(); browser->setFactoryForManager(varManager,varFactory); browser->setFactoryForManager(enumManager,enumFactory); //属性初始化,通过varManager来初始化,其类型为QVariant::Int,其名为INT item = varManager->addProperty(QVariant::Int, QString("INT")); //设置属性的值 item->setValue(12); //将这一条值加到browser之中 browser->addProperty(item); item = varManager->addProperty(QVariant::Bool,QString("BOOL")); item->setValue(false); browser->addProperty(item); item = varManager->addProperty(QVariant::Double,QString("DOUBLE")); item->setValue(10.23); browser->addProperty(item); item = varManager->addProperty(QVariant::String,QString("STRING")); item->setValue("ABC"); browser->addProperty(item); colorType = enumManager->addProperty("COLOR"); QStringList colors; colors<<"Red"<<"Green"<<"Blue"; enumManager->setEnumNames(colorType,colors); enumManager->setValue(colorType,1); browser->addProperty(colorType); layout = new QVBoxLayout(); layout->addWidget(browser); layout->setMargin(0); setLayout(layout); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。