2010-11-19 7 views
3

Hat jemand QtPropertyBrowser als erweiterten Konfigurationseditor verwendet? Alles was ich sehe ist ein GUI-Beispiel, um Eigenschaften von GUI-Elementen zu bearbeiten. Aber wie würde ich anfangen, wenn ich etwas abstrakteres wie die Anwendungskonfiguration bearbeiten möchte?Verwenden von QtPropertyBrowser als erweiterten Konfigurationseditor

Hier ist ein Beispiel:

ich eine Anwendung bin zu schaffen, die ein mehrseitiges Konfigurationsdialog hat. Einige Einstellungen beziehen sich auf den Drucker, einige beziehen sich auf eine Datenbank, einige sind generische Anwendungseinstellungen, einige beziehen sich auf Vorlagen-Dateinamen und/oder Vorlagen. Aber bevor ich all diese detaillierten Konfigurationsseiten im Editor entwerfe, hätte ich gerne einen "fortgeschrittenen" oder "Experten" -Reiter im Dialog, der alle erdenklichen Konfigurationsoptionen auflistet. Später im Entwurfsprozess würde ich mehr und mehr Optionen sammeln, entscheiden, welche die "einfachen" Optionen sind, um in einige benutzerfreundlichere Konfigurationsseiten zu bringen. Um zu googeln kam ich über QtPropertyBrowser, der das richtige Werkzeug zu sein scheint. Aber ich bin mir nicht sicher, wie ich anfangen soll? Ich bin ziemlich sicher, dass ich anstelle von GUI-Objekten eine Art von abstrakten Konfigurationsobjekten (ein oder mehrere) benötige. Aber ich weiß nicht wo oder wie ich damit anfangen soll. Momentan sehen alle meine Ideen viel zu kompliziert aus.

Irgendwelche Vorschläge oder Hinweise zu Hinweisen?

Antwort

9

Sie können sich die Informationen zur Laufzeit anzeigen lassen, die unter QMetaObject verfügbar sind. Ihre Datenobjekte sollten die Nachkommen QObject sein und ein QOBJECT Makro deklariert haben. Außerdem würden Sie eine einfache Routine benötigen, die Datenobjekteigenschaften durchläuft und entsprechende Eigenschaften des Editors erstellt und einrichtet. Das Meta-Objekt bietet auch eine Schnittstelle zum Zurücksetzen von Werten und Methodenaufrufen. Weitere Informationen zum Qt-Property-System finden Sie hier: The Property System. Unten ist ein kleines Beispiel, wie Sie dies tun könnten:

Property Browser und Manager Deklaration und Initialisierung:

QtTreePropertyBrowser  *_browser; 
QtIntPropertyManager  *_intManager; 
QtDoublePropertyManager  *_doubleManager; 
QtStringPropertyManager  *_stringManager; 

_intManager = new QtIntPropertyManager(); 
_doubleManager = new QtDoublePropertyManager(); 
_stringManager = new QtStringPropertyManager(); 

_browser = new QtTreePropertyBrowser(ui->centralWidget); 

Lasteigenschaften Namen und Werte:

void loadProperties(QObject *object) 
{ 
    _browser->clear(); 
    if (object) 
    { 
     const QMetaObject *meta = object->metaObject(); 

     qDebug() << "class : " << meta->className(); 

     for (int i=0; i<meta->propertyCount(); i++) 
     { 
      QMetaProperty metaProperty = meta->property(i); 
      QVariant  value = metaProperty.read(object); 
      QtProperty  *property = NULL; 

      qDebug() << "property : " << metaProperty.name() << " : " << value.toInt(); 

      if (metaProperty.type() == QVariant::Int) 
      { 
       property = _intManager->addProperty(metaProperty.name()); 
       _intManager->setValue(property, value.toInt()); 
      } 
      else if (metaProperty.type() == QVariant::Double) 
      { 
       property = _doubleManager->addProperty(metaProperty.name()); 
       _doubleManager->setValue(property, value.toDouble()); 
      } 
      else if (metaProperty.type() == QVariant::String) 
      { 
       property = _stringManager->addProperty(metaProperty.name()); 
       _stringManager->setValue(property, value.toString()); 
      } 

      if (property) 
       _browser->addProperty(property); 
     } 
    } 
} 
+0

Dies ist in der Tat ein hilfreiches Beispiel, einfach und doch mächtig genug, um darauf aufzubauen. +1 – hurikhan77

0

Im Beispielordner von QtPropertyBrowser kommt eine Demo (object_controller), die ich denke, genau das ist, was Sie wollen. Obwohl das Beispiel zeigt die Eigenschaften einer Klasse QWidgetObjectController empfängt wie in Funktion setObject (QObject * object); eine QObject verwiesen. Denken Sie daran, dass alles, was Sie untersuchen möchten, direkt oder indirekt das Metaobjekt, das Informationen über die Klasse enthält, QObject erben muss. Sie lesen über die Eigenschaften in Qt.

Verwandte Themen