前言
之前,已经详细说明了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;