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);

效果如下:

image.png

修改内容

目前,按照上面代码显示的属性都是不能更改的,如果需要更改,可以添加一个工厂(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);

效果如下:

image.png

如果有些内容想让编辑,有些内容不想让用户编辑,可以设置两个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();
}

效果如下:

image.png

输入如下:

image.png

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

QMap<QtProperty *, QString> propertyToId;
QMap<QString, QtProperty *> idToProperty;


转载自: https://blog.csdn.net/yizhou2010/article/details/52996795


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864