qt扩展属性框qtpropertybrowser 中添加按钮

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

simple

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

示例
其中包括int、bool、string等普通数据类型,file文件类型,group族类型等。如果要重绘某种类型的控件如何办呢?

特殊需求

比如在group中来增加两个按钮,实现组内成员的增减,效果如下:
示例
点击“+”,组内增加指定类型的成员,点击“-”,组内删除选中的成员。

问题

需要解决以下问题:

  1. 把按钮加进去
  2. 给多组“+”/"-"按钮绑定信号槽
  3. 改变group组的显示风格,例如:按钮正常状态下也要显示/不设置焦点捕获等
  4. 兼容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(
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值