上一节,我们将了如何去配置QtPropertyBrowser
本节,我们将说明 如何 去 使用QtPropertyBrowser 这个属性类的一些基本知识
简单的几种用法:
首先:
我们需要创建一个Widget 提升一个类 为 QtTreePropertyBrowser
.h文件
QtVariantPropertyManager* m_pVarManager;
.cpp文件
m_pVarManager = new QtVariantPropertyManager(ui.widget);
第一种:添加键值对属性
列如:int,bool,double,string类型
//设置 int 类型
QtVariantProperty* item = m_pVarManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
ui.widget->addProperty(item);
//设置 Bool类型
item = m_pVarManager->addProperty(QVariant::Bool, QStringLiteral("Bool: "));
item->setValue(true);
ui.widget->addProperty(item);
//设置 Double类型
item = m_pVarManager->addProperty(QVariant::Double, QStringLiteral("Double: "));
item->setValue(13.14);
ui.widget->addProperty(item);
//设置 Double类型
item = m_pVarManager->addProperty(QVariant::String, QStringLiteral("String: "));
item->setValue(QStringLiteral("lion_cxq"));
ui.widget->addProperty(item);
第二种:添加可编辑的键值对属性
QtVariantEditorFactory 这个就是 可编辑的 工厂,我们将属性添加进来,就可以让值属性可以进行编辑
QtVariantEditorFactory* editFactory = new QtVariantEditorFactory(ui.widget);
ui.widget->setFactoryForManager(m_pVarManager, editFactory);
//添加可编辑工厂
QtVariantEditorFactory* editFactory = new QtVariantEditorFactory(ui.widget);
ui.widget->setFactoryForManager(m_pVarManager, editFactory);
//设置 int 类型
QtVariantProperty* item = m_pVarManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
ui.widget->addProperty(item);
//设置 Bool类型
item = m_pVarManager->addProperty(QVariant::Bool, QStringLiteral("Bool: "));
item->setValue(true);
ui.widget->addProperty(item);
//设置 Double类型
item = m_pVarManager->addProperty(QVariant::Double, QStringLiteral("Double: "));
item->setValue(13.14);
ui.widget->addProperty(item);
//设置 Double类型
item = m_pVarManager->addProperty(QVariant::String, QStringLiteral("String: "));
item->setValue(QStringLiteral("lion_cxq"));
ui.widget->addProperty(item);
第三种:想要一些可编辑 和 一些不可编辑的 属性值
.h文件
QtVariantPropertyManager* m_pEditableManager;
QtVariantPropertyManager* m_pNotEditManager;
.cpp文件
m_pEditableManager = new QtVariantPropertyManager(ui.widget);
m_pNotEditManager = new QtVariantPropertyManager(ui.widget);
//m_pEditableManager 可编辑管理器 添加可编辑工厂
QtVariantEditorFactory* editFactory = new QtVariantEditorFactory(ui.widget);
ui.widget->setFactoryForManager(m_pEditableManager, editFactory);
//设置 int 类型 可以编辑 使用 可编辑管理器添加
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
ui.widget->addProperty(item);
//设置 int 类型 不可以编辑 使用 不可编辑管理器添加
QtVariantProperty* item2 = m_pNotEditManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item2->setValue(40);
ui.widget->addProperty(item2);
第四种:添加分组 的 属性值
QtProperty* groupItem1 = m_pEditableManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral(“分组1”));
groupItem1->addSubProperty(item);
m_pEditableManager = new QtVariantPropertyManager(ui.widget);
m_pNotEditManager = new QtVariantPropertyManager(ui.widget);
//添加可编辑工厂
QtVariantEditorFactory* editFactory = new QtVariantEditorFactory(ui.widget);
ui.widget->setFactoryForManager(m_pEditableManager, editFactory);
QtProperty* groupItem1 = m_pEditableManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral("分组1"));
//设置 int 类型
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
groupItem1->addSubProperty(item);
QtProperty* groupItem2 = m_pNotEditManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral("分组2"));
QtVariantProperty* item2 = m_pNotEditManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item2->setValue(40);
groupItem2->addSubProperty(item2);
ui.widget->addProperty(groupItem1);
ui.widget->addProperty(groupItem2);
第五种:修改了值,我们肯定要获取到值
当属性被编辑修改时,是会产生信号的,信号如下
QtVariantPropertyManager::valueChanged(QtProperty *property, constQVariant &value)
我们需要定义一个QMap来存储QtProperty和每个条目的名字之间的对应关系,在创建每个条目的时候存储这两个参数。再创建一个槽函数,参数为信号对应的参数
.h文件
QtVariantPropertyManager* m_pEditableManager;
QtVariantPropertyManager* m_pNotEditManager;
QMap<QtProperty*, QString> m_PropertyToQString;
.cpp文件
m_pEditableManager = new QtVariantPropertyManager(ui.widget);
m_pNotEditManager = new QtVariantPropertyManager(ui.widget);
//添加可编辑工厂
QtVariantEditorFactory* editFactory = new QtVariantEditorFactory(ui.widget);
ui.widget->setFactoryForManager(m_pEditableManager, editFactory);
QtProperty* groupItem1 = m_pEditableManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral("分组1"));
//设置 int 类型
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
m_PropertyToQString[item] = "Int";
groupItem1->addSubProperty(item);
QtProperty* groupItem2 = m_pNotEditManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral("分组2"));
QtVariantProperty* item2 = m_pNotEditManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item2->setValue(40);
groupItem2->addSubProperty(item2);
ui.widget->addProperty(groupItem1);
ui.widget->addProperty(groupItem2);
connect(m_pEditableManager, &QtVariantPropertyManager::valueChanged, this, &QtPropertyBrowserTest::PropertyValueChanged);
槽函数:
void QtPropertyBrowserTest::PropertyValueChanged(QtProperty* property, const QVariant& value)
{
QString propertyName = m_PropertyToQString[property];
qDebug() << "propertyName:" << propertyName << "value.toString():" << value.toString();
}
第六种:当我们的键值非常长时,不能移动,导致出现…现象
QtTreePropertyBrowser::Interactive | 交互 |
---|---|
QtTreePropertyBrowser::Fixed | 固定 |
QtTreePropertyBrowser::ResizeToContents | 自动调整内容 |
QtTreePropertyBrowser::Stretch | 拉伸 |
ui.widget->setResizeMode(QtTreePropertyBrowser::Interactive);
源码中只能设置首列的长度:
ui.widget->setSplitterPosition(100);
修改源码系列可更改任意index 的 值 宽度 QtPropertyBrowser 更改index长度
第七种:QVariant::Double类型的 只能有2位小数
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Double, QStringLiteral("Double: "));
item->setValue(13.14123);
ui.widget->addProperty(item);
设置后我们发现,只显示了两个小数 位 13.14,如何修改可以有多个小数呢
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Double, QStringLiteral("Double: "));
item->setValue(13.14123);
item->setAttribute(QStringLiteral("decimals"), 5);
ui.widget->addProperty(item);
这样我们就可以显示多个小数位
来自该链接:QtPropertyBrowser 小数位数修改
第八种:收缩或者展开我们的折叠框
QtProperty* groupItem1 = m_pEditableManager->addProperty(QtVariantPropertyManager::groupTypeId(), QStringLiteral("分组1"));
ui.widget->addProperty(groupItem1);
QList<QtBrowserItem*> list = ui.widget->items(groupItem1);
ui.widget->setExpanded(list.at(0), false);
这样我们就可以搜索我们的折叠框
来自该链接:QtPropertyBrowser 折叠框修改
第九种:表格的选中单行的信号响应
.h
QList<QtProperty*> m_PropertyList;
.cpp
QtVariantProperty* item = m_pEditableManager->addProperty(QVariant::Int, QStringLiteral("Int: "));
item->setValue(20);
m_PropertyToQString[item] = "Int";
groupItem1->addSubProperty(item);
m_PropertyList.push_back(item);
connect(ui.widget, &QtTreePropertyBrowser::currentItemChanged, this, &QtPropertyBrowserTest::slotItemChanged);
槽函数:
void QtPropertyBrowserTest::slotItemChanged(QtBrowserItem* item)
{
int index = -1;
for (int i = 0; i < m_PropertyList.size(); i++)
{
if (m_PropertyList[i] == item->property())
{
index = i;
break;
}
}
qDebug() << index;
}
第十种:修改标题
修改源码,在源码中添加 函数
class QtTreePropertyBrowser : public QtAbstractPropertyBrowser
{
public:
void setHeaderLabels(const QStringList &labels);
}
void QtTreePropertyBrowser::setHeaderLabels(const QStringList &labels)
{
d_ptr->m_treeWidget->setHeaderLabels(labels);
}
在我们需要修改头键值对名称的地方添加
QStringList head;
head << QStringLiteral("轴号") << QStringLiteral("坐标值(mm)");
ui->widget->setHeaderLabels(head);
这样我们就可以修改我们的头标题
来自该链接:QtPropertyBrowser 头标题修改
参考博客:
QtPropertyBrowser 简单属性值 使用 一
QtPropertyBrowser 键值长度错误 修改
QtPropertyBrowser 使用 二
QtPropertyBrowser 自定义类型