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