2010-11-19 5 views
3

Est-ce que quelqu'un a utilisé QtPropertyBrowser comme éditeur de configuration avancé? Tout ce que je vois un exemple d'interface graphique, pour éditer les propriétés des éléments de l'interface graphique. Mais comment pourrais-je commencer si je voulais éditer quelque chose de plus abstrait, comme la configuration de l'application.Utilisation de QtPropertyBrowser comme éditeur de configuration avancé

Voici un exemple:

Je crée une application qui a une boîte de dialogue de configuration multipage. Certains paramètres concernent l'imprimante, certains concernent une base de données, certains sont des paramètres d'application génériques, d'autres concernent des noms de fichiers de modèles et/ou des modèles. Mais avant de concevoir toutes ces pages de configuration détaillées dans l'éditeur, j'aimerais avoir un onglet "avancé" ou "expert" dans la boîte de dialogue qui répertorie toutes les options de configuration imaginables. Plus tard dans le processus de conception, je voudrais collecter de plus en plus d'options, décider quelles sont les options "faciles" à mettre dans certaines pages de configuration plus conviviales. Et googling autour je suis venu à travers QtPropertyBrowser qui semble être le bon outil. Mais je ne suis pas sûr de savoir comment commencer? Je suis à peu près sûr que, à la place des objets GUI, j'ai besoin d'objets de configuration abstraits (un ou plusieurs). Mais je ne sais pas où ou comment commencer avec ça. Actuellement, toutes mes idées semblent très compliquées.

Des suggestions ou des pointeurs vers des conseils?

Répondre

9

Vous voudrez peut-être consulter les informations sur le type d'exécution disponibles via la classe QMetaObject. Vos objets de données doivent être des descendants de QObject et une macro QOBJECT doit être déclarée. Vous auriez également besoin d'une routine simple qui parcourrait les propriétés des objets de données et créerait et définirait les propriétés de l'éditeur correspondant. Meta object fournit également une interface pour la réinitialisation des valeurs et l'invocation des méthodes. Plus d'informations sur le système de propriété Qt est ici: The Property System. Voici un petit exemple sur la façon dont vous pourriez faire ceci:

Navigateur de propriétés et la déclaration des gestionnaires et initialisation:

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

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

_browser = new QtTreePropertyBrowser(ui->centralWidget); 

propriétés de charge des noms et des valeurs:

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

Ceci est en effet un exemple utile, simple et pourtant assez puissant pour construire sur. +1 – hurikhan77

0

Dans le dossier des échantillons de QtPropertyBrowser vient une démo (object_controller) que je pense est exactement ce que vous voulez. Bien que l'exemple montre les propriétés d'une classe QWidgetObjectController reçoit comme référencé dans la fonction setObject (QObject * object); un QObject. Gardez juste à l'esprit que tout ce que vous voulez inspecter doit hériter QObject, directement ou indirectement, c'est-à-dire le méta-objet contenant des informations sur la classe. Vous avez lu sur les propriétés dans Qt.

Questions connexes