类似于这种:
就是右下角这个框,有属性名字和对应的value编辑。
这个Widget是作为一个QDockWidget被添加到QMainWindow中的。QMainWindow必须要有centralWidget才能添加DockWidget。DockWidget是可以浮动于centralWidget周边(上下左右)的一种Widget。QMainWindow中有addDockWiget这相应的函数添加。
而QDockWidget中可以设置相应的Widget,这个Widget(实际上就是属性编辑浏览窗口。)这个Widget实际上不是Qt Native自带的。而是Qt的解决方案中提供的Widget,也就是别人帮你封装做好了Widget,拿来用就可以了。这个Widget就是QtPropertyBrowser
样例代码:
nodeproperty.h 此类继承了QDockWidget
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #ifndef NODE_PROPERTY_H 2 #define NODE_PROPERTY_H 3 4 #include <QObject> 5 #include <QDockWidget> 6 #include "diagramitem.h" 7 8 9 QT_BEGIN_NAMESPACE 10 11 class QDockWidget; 12 class QtVariantPropertyManager; 13 class QtProperty; 14 class QtVariantProperty; 15 class QtVariantEditorFactory; 16 class QtTreePropertyBrowser; 17 QT_END_NAMESPACE 18 19 20 class NodePropertyWidget:public QDockWidget 21 { 22 public: 23 24 NodePropertyWidget(DiagramItem::DiagramType type, QWidget* parent = 0); 25 ~NodePropertyWidget(); 26 27 private: 28 void createProcessTreeProperty(); 29 void createDisplayTreeProperty(); 30 void createArrowTreeProperty(); 31 32 private: 33 QtVariantPropertyManager *variantManager; 34 QtProperty *topItem; 35 QtVariantProperty *item; 36 QtVariantEditorFactory *variantFactory; 37 QtTreePropertyBrowser *variantEditor; 38 }; 39 40 41 42 43 #endif
nodeproperty.cpp
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <QDate> 2 #include <QLocale> 3 #include <QDockWidget> 4 #include <QSizePolicy> 5 6 #include "qtpropertymanager.h" 7 #include "qtvariantproperty.h" 8 #include "qttreepropertybrowser.h" 9 10 #include "nodeproperty.h" 11 12 13 14 15 16 NodePropertyWidget::NodePropertyWidget(DiagramItem::DiagramType type, QWidget * parent) :QDockWidget(parent) 17 { 18 19 switch (type) 20 { 21 case DiagramItem::Process: 22 setWindowTitle("Process Property"); 23 setFloating(true); 24 25 setAllowedAreas(Qt::RightDockWidgetArea); 26 setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred); 27 createProcessTreeProperty(); 28 break; 29 case DiagramItem::Display: 30 setWindowTitle("Display Property"); 31 setFloating(true); 32 33 setAllowedAreas(Qt::RightDockWidgetArea); 34 setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred); 35 createDisplayTreeProperty(); 36 break; 37 case DiagramItem::Line: 38 setWindowTitle("Arrow Property"); 39 setFloating(true); 40 41 setAllowedAreas(Qt::RightDockWidgetArea); 42 setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Preferred); 43 createArrowTreeProperty(); 44 break; 45 default: 46 break; 47 } 48 } 49 50 NodePropertyWidget::~NodePropertyWidget() 51 { 52 53 delete variantManager; 54 delete variantFactory; 55 delete variantEditor; 56 } 57 58 59 void NodePropertyWidget::createProcessTreeProperty(){ 60 61 variantManager = new QtVariantPropertyManager(); 62 63 int i = 0; 64 topItem = variantManager->addProperty(QtVariantPropertyManager::groupTypeId(), 65 QString::number(i++) + QLatin1String("Process Property")); 66 67 item = variantManager->addProperty(QVariant::Bool, QString::number(i++) + QLatin1String(" Bool Property")); 68 item->setValue(true); 69 topItem->addSubProperty(item); 70 71 item = variantManager->addProperty(QVariant::Int, QString::number(i++) + QLatin1String(" Int Property")); 72 item->setValue(20); 73 item->setAttribute(QLatin1String("minimum"), 0); 74 item->setAttribute(QLatin1String("maximum"), 100); 75 item->setAttribute(QLatin1String("singleStep"), 10); 76 topItem->addSubProperty(item); 77 78 item = variantManager->addProperty(QVariant::Int, QString::number(i++) + QLatin1String(" Int Property (ReadOnly)")); 79 item->setValue(20); 80 item->setAttribute(QLatin1String("minimum"), 0); 81 item->setAttribute(QLatin1String("maximum"), 100); 82 item->setAttribute(QLatin1String("singleStep"), 10); 83 item->setAttribute(QLatin1String("readOnly"), true); 84 topItem->addSubProperty(item); 85 86 item = variantManager->addProperty(QVariant::Double, QString::number(i++) + QLatin1String(" Double Property")); 87 item->setValue(1.2345); 88 item->setAttribute(QLatin1String("singleStep"), 0.1); 89 item->setAttribute(QLatin1String("decimals"), 3); 90 topItem->addSubProperty(item); 91 92 item = variantManager->addProperty(QVariant::Double, QString::number(i++) + QLatin1String(" Double Property (ReadOnly)")); 93 item->setValue(1.23456); 94 item->setAttribute(QLatin1String("singleStep"), 0.1); 95