simple
QtPropertyBrowser提供了丰富的示例来展示该扩展是如何使用的。
示例simple展示如下:

其中包括int、bool、string等普通数据类型,file文件类型,group族类型等。如果要重绘某种类型的控件如何办呢?
特殊需求
比如在group中来增加两个按钮,实现组内成员的增减,效果如下:

点击“+”,组内增加指定类型的成员,点击“-”,组内删除选中的成员。
问题
需要解决以下问题:
- 把按钮加进去
- 给多组“+”/"-"按钮绑定信号槽
- 改变group组的显示风格,例如:按钮正常状态下也要显示/不设置焦点捕获等
- 兼容int/double/bool/file等众多类型,模板化
方法
选用simple示例中展示的size类型来进行重写,当然你可以选择你感兴趣的任何类型。
QtVectorPropertyManager的实现
继承QtVariantPropertyManager,实现以下接口:
QString valueText(const QtProperty *property) const;
virtual void initializeProperty(QtProperty *property);
virtual void uninitializeProperty(QtProperty *property);
QtProperty *addProperty(const QString &name);
QtVectorEditoryFactory的实现
继承QtAbstractEditorFactory,实现以下接口:
void connectPropertyManager(QtArrayPropertyManager *manager);
QWidget *createEditor(QtArrayPropertyManager *manager, QtProperty *property,
QWidget *parent); //关于按钮的,主要在createEditor这个函数里实现。
void disconnectPropertyManager(QtArrayPropertyManager *manager);
void pushGroupItem(QtProperty *property);
void delGroupItem(QtProperty* property);
void btnSignalsSlots();
qtvectorypropertymanager.h
QtVectorPropertyManager.h
class QtVectorPropertyManager: public QtVariantPropertyManager
{
Q_OBJECT
public:
explicit QtVectorPropertyManager(QWidget *parent = 0);
virtual ~QtVectorPropertyManager();
public:
// must a name to identity different group
QtProperty *addProperty(const QString &name);
//
void setValue(const QString &value);
void setTreeBrowser(QtAbstractPropertyBrowser* browser);
QtAbstractPropertyBrowser* getTreeBrowser();
protected:
QString displayText(const QtProperty *property) const;
QString valueText(const QtProperty *property) const;
virtual void initializeProperty(QtProperty *property);
virtual void uninitializeProperty(QtProperty *property);
private:
QMap<const QtProperty *, QString> _propertyToGroup;
// 用于动态绑定
QtAbstractPropertyBrowser *_browser;
};
qtvectorypropertymanager.cpp
QtVectoryPropertyManager.cpp
QtVectoryPropertyManager::QtVectoryPropertyManager(QWidget *parent) :
QtVectoryPropertyManager(parent)
{
}
QtVectoryPropertyManager::~QtVectoryPropertyManager()
{
}
// must a name to identity different group
QtProperty* QtVectoryPropertyManager::addProperty(const QString &name)
{
// add a top item
QtProperty* topItem = QtVariantPropertyManager::addProperty(QVariant::Size, name);
_propertyToGroup[topItem] = name;
topItem->setGroupBox(true);
return topItem;
}
//
void QtVectoryPropertyManager::setValue(const QString &value)
{
return;
}
void QtVectoryPropertyManager::setTreeBrowser(QtAbstractPropertyBrowser* browser)
{
_browser = browser;
}
QtVectoryPropertyManager* QtArrayPropertyManager::getTreeBrowser(

本文详细介绍了如何通过QtPropertyBrowser的扩展,实现自定义编辑器,以增加组内成员的增减功能。从QtVectorPropertyManager和QtVectorEditorFactory的实现,到兼容多种数据类型,再到改变group组的显示风格,提供了全面的代码示例和实现思路。
最低0.47元/天 解锁文章
456





