QtTreePropertyBrowser的部署
在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了。
创建一个browser
//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),工厂同样有不同类型,来对应管理器。
例子1
先从常用的属性来看:
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);
这些属性都是可修改的,因为管理器一旦设置了工厂,之后经由该管理器添加的值都是可变的。
例子2
常用的基本类型可以像上面的一样添加。但是,另外一种常见的枚举类型却要用别的管理器来添加。
// 枚举管理器和工厂的声明
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);
}