QtTreePropertyBrowser控件的使用

前言

之前,已经详细说明了QtPropertyBrowser的安装配置,可参见我的博客《QtPropertyBrowser控件在Qt5.5上的安装配置》,下面具体讲述如何使用QtPropertyBrowser中QtTreePropertyBrowser控件。

添加内容

QtTreePropertyBrowser是通过Manager来管理属性的,他提供了很多类型的管理,属性表里的属性条目,是通过Manager来创建并且管理的。因此需要创建属性时,首先要创建一个Manager,再通过Manager来创建属性。Manager的addProperty()函数就是用于生成属性,同时,Manager提供了几个信号,用于告知属性的改变,它们是:propertyInserted(), propertyRemoved(), propertyChanged() 和propertyDestroyed(),各种类型的Manager如下:
QtBoolPropertyManager
QtColorPropertyManager
QtDatePropertyManager
QtDateTimePropertyManager
QtDoublePropertyManager
QtEnumPropertyManager
QtFlagPropertyManager
QtFontPropertyManager
QtGroupPropertyManager
QtIntPropertyManager
QtPointPropertyManager
QtRectPropertyManager
QtSizePropertyManager
QtSizePolicyPropertyManager
QtStringPropertyManager
QtTimePropertyManager
QtVariantPropertyManager

每个属性条目对应着QtProperty或者QtVariantProperty,属性条目都是通过Manager的addProperty函数生成,函数是个工厂函数,返回一个Property的指针,通过这个Property指针,可以对属性值进行设置。通过QtTreePropertyBrowser的addProperty函数把Property添加进属性表进行显示,下面演示属性条目的添加:
.h文件

QtVariantPropertyManager* m_pVarManager;

.cpp文件

m_pVarManager = new QtVariantPropertyManager(ui->propertyTree);
QtProperty *groupItem = m_pVarManager->addProperty(QtVariantPropertyManager::groupTypeId(),QStringLiteral("Group1"));
QtVariantProperty *item = m_pVarManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(100);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::Bool, QStringLiteral("Bool: "));
item->setValue(true);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::Double, QStringLiteral("Double: "));
item->setValue(3.1415);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::String, QStringLiteral("String: "));
item->setValue(QStringLiteral("hello world"));
groupItem->addSubProperty(item);

ui->propertyTree->addProperty(groupItem);

效果如下:
这里写图片描述

修改内容

目前,按照上面代码显示的属性都是不能更改的,如果需要更改,可以添加一个工厂(Factory),QtTreePropertyBrowser的setFactoryForManager函数,会把一个Manager和一个Factory关联起来,那么所有Manager产生的属性,都可以进行编辑。
.h文件

QtVariantPropertyManager *m_pVarManager;
QtVariantEditorFactory *m_pVarFactory;

.cpp文件

m_pVarManager = newQtVariantPropertyManager(ui->propertyTree);
m_pVarFactory = newQtVariantEditorFactory(ui->propertyTree);
QtProperty *groupItem = m_pVarManager->addProperty(QtVariantPropertyManager::groupTypeId(),QStringLiteral("Group1"));

QtVariantProperty *item = m_pVarManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(100);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::Bool,QStringLiteral("Bool: "));
item->setValue(true);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::Double,QStringLiteral("Double: "));
item->setValue(3.14);
groupItem->addSubProperty(item);

item = m_pVarManager->addProperty(QVariant::String,QStringLiteral("String: "));
item->setValue(QStringLiteral("hello world"));
groupItem->addSubProperty(item);

ui->propertyTree->addProperty(groupItem);
ui->propertyTree->setFactoryForManager(m_pVarManager,m_pVarFactory);

效果如下:
这里写图片描述
如果有些内容想让编辑,有些内容不想让用户编辑,可以设置两个manager,一个设置Factory另外一个不设置,那么设置了Factory的manager生成的属性就可以编辑,没设置的就不可用编辑了 。

信号与槽

QtAbstractPropertyManager里有propertyChanged信号,响应属性的值的改变,但这个信号你不清楚属性是什么类型的(bool ,int ,string,double?) 因此很少使用:
void QtAbstractPropertyManager::propertyChanged ( QtProperty * property );

如果是用QtVariantPropertyManager,那么它的valueChanged 信号将会是你经常使用的信号,它会发生发生更改的属性指针以及更改后的值。
void valueChanged ( QtProperty * property, const QVariant & value )
但为了知道是哪个属性,需要附加一个map来进行记录。

.h文件

QMap<QtProperty*,QString> m_property_dic;
QtVariantPropertyManager *m_pVarManager;
QtVariantEditorFactory *m_pVarFactory;

private slots:
void variantPropertyValueChanged(QtProperty* property, const QVariant &value);

.cpp文件

XXXClass::XXXClass(QWidget *parent)
:QMainWindow(parent),ui(newUi::XXXClass) {
        m_pVarManager= new QtVariantPropertyManager(ui->TreePropertyBrowser);
    m_pVarManagerReadOnly = new QtVariantPropertyManager(ui->TreePropertyBrowser);
    m_pVarFactory = new QtVariantEditorFactory(ui->TreePropertyBrowser);

    connect(m_pVarManager, &QtVariantPropertyManager::valueChanged, this, &MainWindow::variantPropertyValueChanged);
    QtProperty *groupitem = m_pVarManager->addProperty(QtVariantPropertyManager::groupTypeId(),tr("Group1"));
    QtVariantProperty *item;
    item = m_pVarManager->addProperty(QVariant::Int, tr("Int: "));
    item->setValue(100);
    groupitem->addSubProperty(item);
    m_property_dic[item] = "Int:";

    item = m_pVarManager->addProperty(QVariant::Bool, tr("Bool: "));
    item->setValue(true);
    groupitem->addSubProperty(item);
    m_property_dic[item] = "Bool: ";

    item = m_pVarManager->addProperty(QVariant::Double, tr("Double:"));
    item->setValue(3.1415926);
    groupitem->addSubProperty(item);
    m_property_dic[item] = "Double: ";

    item = m_pVarManager->addProperty(QVariant::String, QStringLiteral("String: "));
    item->setValue(QStringLiteral("hello world"));
    groupitem->addSubProperty(item);
    m_property_dic[item] = "String: ";

    ui->TreePropertyBrowser->addProperty(groupitem);
    ui->TreePropertyBrowser->setFactoryForManager(m_pVarManager, m_pVarFactory);
}

voidXXXClass::variantPropertyValueChanged(QtProperty *property, constQVariant &value)
{
    QString str = m_property_dic[property];
    qDebug()<<str<<": "<<value<<": "<<value.type();
}

效果如下:
这里写图片描述

输入如下:
这里写图片描述

参考提供的例子,有时候,为了方便双向控制,还会建立一个映射

QMap<QtProperty *, QString> propertyToId;
QMap<QString, QtProperty *> idToProperty;
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值