当前位置:   article > 正文

QtTreePropertyBrowser:制作属性表_qtpropertybrower的factory头文件是哪个

qtpropertybrower的factory头文件是哪个

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)
  • 1
  • 2

3.重新构建即可
在这里插入图片描述

可以看到,工程中已经出现qttreepropertybrowser了。

创建一个browser

//widget.h
QtTreePropertyBrowser *browser;
  • 1
  • 2

需要添加头文件

#include <qttreepropertybrowser.h>
  • 1
//.cpp
// browser 初始化
 browser = new QtTreePropertyBrowser();
 browser->show();
  • 1
  • 2
  • 3
  • 4

运行:
在这里插入图片描述

得到一个空架子,但是它飘在主窗口之外,需要给它加一个父容器限制其位置。

// 这个this指向当前窗口
browser = new QtTreePropertyBrowser(this);
//browser->show();//可以不要
  • 1
  • 2
  • 3

在这里插入图片描述
有了父容器限制,但是其大小也随之固定了。要想让其随父容器改变而改变,则需要给它加一个布局限制。

	//widget.h
	QVBoxLayout *layout;
  • 1
  • 2
	//widget.cpp
	// 布局,放最后
	layout = new QVBoxLayout();
    layout->addWidget(browser);
    layout->setMargin(0);
    setLayout(layout);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
善。

添加属性

必要条件

1.所有属性都必须通过管理器(Manager)添加,不同类型的属性有不同类型的管理器。
2.管理器只管加,不管改。
3.如果要对创造出来的属性进行值的修改,必须借助加工工厂(Factory),工厂同样有不同类型,来对应管理器。

例子1

先从常用的属性来看:
int,double,bool,string都是常用的类型,他们对应的Manager有:
QtIntPropertyManager,QtDoublePropertyManager,QtBoolPropertyManager,QtStringPropertyManager.
链接: QtAbstractPropertyManager .
虽然一对一很好,不过在创造数据项的时候,可能没有必要全都用。
还好Variant是个很方便的类型,可以包括以上的类型,而且QtVariantPropertyManager也是存在的,可以用来添加以上这些类型的属性。
声明:

	//.h
	// variant管理器声明
	QtVariantPropertyManager *varManager;	
	//属性声明
	QtVariantProperty *item;
  • 1
  • 2
  • 3
  • 4
  • 5

需要添加头文件:

	#include <qtvariantproperty.h>
  • 1

初始化:

// variant管理器初始化
 	varManager = new QtVariantPropertyManager();
 //属性初始化,通过varManager来初始化,其类型为QVariant::Int,其名为INT
	item = varManager->addProperty(QVariant::Int, QString("INT"));
 //设置属性的值
 	item->setValue(12);
 //将这一条值加到browser之中
 	browser->addProperty(item);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
第一条属性已经添加好了。但是只能看,不能改,需要为管理器(Manager)添加工厂(Factory)

// variant工厂声明
	QtVariantEditorFactory *varFactory;
  • 1
  • 2
// 初始化
	varFactory = new QtVariantEditorFactory();
// 为管理器设置工厂	
	browser->setFactoryForManager(varManager,varFactory);
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
值已经可以修改了。
同理,可以添加其他的属性:

// 其他属性
	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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述
这些属性都是可修改的,因为管理器一旦设置了工厂,之后经由该管理器添加的值都是可变的。

例子2

常用的基本类型可以像上面的一样添加。但是,另外一种常见的枚举类型却要用别的管理器来添加。

// 枚举管理器和工厂的声明
	QtEnumPropertyManager *enumManager;
    QtEnumEditorFactory *enumFactory;
  • 1
  • 2
  • 3

需要头文件:

	#include <qtpropertymanager.h>
	#include <qteditorfactory.h>
  • 1
  • 2

(PS.这些头文件管辖范围和命名规则有点混乱哈~)
枚举值不能用上面的item属性了。

// 声明一个枚举属性,表示颜色
	QtProperty *colorType;
  • 1
  • 2

初始化:

// 枚举管理器和工厂初始化
	enumManager = new QtEnumPropertyManager();
    enumFactory = new QtEnumEditorFactory();
// 为枚举管理器设置工厂
    browser->setFactoryForManager(enumManager,enumFactory);
  • 1
  • 2
  • 3
  • 4
  • 5
// 初始化,通过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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
到这里为止就是一个很有用的属性表了。

参考资料:
链接: 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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
// 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/115133
推荐阅读
  

闽ICP备14008679号