QtTreePropertyBrowser:制作属性表

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);
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值