2010-11-19 21 views
3

QtPropertyBrowserを高度な設定エディタとして使用した人はいますか? GUI要素のプロパティを編集するためのGUIの例がすべて表示されます。しかし、アプリケーション構成のように、より抽象的なものを編集したいと思えば、私はどのように始めますか?私はマルチ設定ダイアログを持つアプリケーションを作成してい高度な設定エディタとしてQtPropertyBrowserを使用する

は、ここでの例です。いくつかの設定はプリンタに関するもの、データベースに関するもの、一般的なアプリケーション設定、テンプレートファイル名やテンプレートに関するものなどがあります。しかし、エディタですべての詳細な設定ページを設計する前に、ダイアログ内に「高度な」タブまたは「エキスパート」タブを用意して、想像できるすべての設定オプションをリストアップします。デザインプロセスの後半に、私はますます多くのオプションを集めて、より使いやすい設定ページに入れるための「簡単な」オプションを決定します。私はグッドなQtPropertyBrowserを見つけました。これは正しいツールのようです。しかし、私はどのように開始するか分からないのですか? GUIオブジェクトではなく、抽象的な設定オブジェクト(1つまたは複数)を必要としていることは間違いありません。しかし、どこから始めるか、どのように始めるかはわかりません。現在私の考えはすべて複雑に見えます。

ヒントへのご意見やご要望はありますか?

答えて

9

QMetaObjectクラスから入手できる実行時の型情報を見てみるとよいでしょう。データオブジェクトはQObjectの子孫で、QOBJECTマクロが宣言されている必要があります。また、データオブジェクトのプロパティを反復し、対応するエディタのプロパティを作成して設定する単純なルーチンが必要になります。 Metaオブジェクトは、値とメソッドの呼び出しをリセットするためのインタフェースも提供しています。 Qtプロパティシステムの詳細は、The Property Systemです。以下は、この操作を行う可能性がどのように小さな例です。

プロパティブラウザや管理者の宣言と初期化:

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

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

_browser = new QtTreePropertyBrowser(ui->centralWidget); 

負荷のプロパティ名と値:QtPropertyBrowserのサンプルフォルダに

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

これは確かに便利な例ですが、シンプルでしかも強力です。 +1 – hurikhan77

0

デモ(object_controller)が来て、あなたが望むものと思っています。この例では、クラスQWidgetObjectControllerのプロパティは、関数setObject (QObject * object);で参照されるように受け取っていますが、QObjectです。検査したいのは直接的または間接的にクラスに関する情報を含むメタオブジェクトであるQObjectを継承しなければならないことに留意してください。あなたはQtのプロパティについて読んでいます。

関連する問題