前言
之前,已经详细说明了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;
转载自: https://blog.csdn.net/yizhou2010/article/details/52996795

