本文从我原先发布在 CSDN 的文章迁移而来,原文链接:https://blog.csdn.net/wang112031/article/details/105279018。
Qt 属性控件,Qt5 安装时勾选源码安装,源码路径里面就有源码QtPropertyBrowser ,参考这篇博客https://blog.csdn.net/czyt1988/article/details/78140050 只要在项目的pro 加入qtpropertybrowser如下路径即可使用:
include($$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri)Qt4 qtpropertybrowser的下载地址为:https://github.com/qtproject/qt-solutions/tree/master/qtpropertybrowser
里面有很多实例代码,稍微修改一下就可以Qt5 上运行,可以参考学习。
这篇博客主要是初步学习将Qt 的自有控件属性展示到属性控件中,后续在尝试结合自定义插件控件进一步学习。
如何获取控件的属性以及当前的控件属性,QMetaObject 元对象已经提供了对应的接口,如下即可以获取当前类的属性:
const QMetaObject *metaobject = ui->spinBox->metaObject();
int count = metaobject->propertyCount(); //获取元对象的所有属性
int index = metaobject->propertyOffset();//获取当前控件的第一个属性index
for (int i = index; i < count; ++i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = ui->spinBox->property(name);
qDebug() << name << value;
}参考 Qt4 qtpropertybrowser 里面的object_controller 实例就很简单了,想要的别人已经实现好了,ObjectController 类继承于QWidget,将QWidget 提升为ObjectController 为QWidget,调用setObeject 接口即可加载控件的属性。
ui->objectController->setObject(ui->spinBox)测试后发现加载了所有的属性,即包括父类属性,跟踪接口 setObject ==》》addClassProperties ,addClassProperties 递归加载所有超类的属性,去掉递归既可以实现只加载当前控件的属性。
void ObjectControllerPrivate::addClassProperties(const QMetaObject *metaObject)
{
if (!metaObject)
return;
//去掉递归,防止加载父类属性,metaObject->superClass() 返回元对象的超类
//addClassProperties(metaObject->superClass());
QtProperty *classProperty = m_classToProperty.value(metaObject);
if (!classProperty) {最终实现效果如下:

测试代码下载地址:https://download.csdn.net/download/wang112031/12296877
回复 / 留言