2016-04-25 16 views
0

QtCreatorに同じクラスから昇格されたウィジェットが2つあります。しかし、私は両者に微妙な違いを持たせたいので、昇格したクラスがそれを区別するために使用できるUIファイルにいくつかの違いを渡したいと思います。動的プロパティは、UIエディタで移動する方法と同じように見えますが、私はプロモートされた各ウィジェットに動的プロパティを割り当てました。コードでは、私はプロパティにアクセスしようとしたが、オブジェクトが作成された後QtはsetProperty()を呼び出しているためか(のみ利用でき、構築後のようです。Qt:qtcreatorから動的プロパティにいつアクセスできますか?

MyWidget::MyWidget(QWidget* parent) : QGLWidget(parent) 
{ 
    this->property("someProperty").toString(); // returns blank 
} 

void MyWidget::initializeGL() 
{ 
    this->property("someProperty").toString(); // returns string set in UI file 
} 

だから私の質問はどのように人々は、コンストラクタのためにこれらのプロパティを使用しますか気づきました私は、OpenGLを初期化することに関連していないかもしれないので、奇妙に思えます。私はまた、プロパティ変更された信号に接続し、そこに行うことができると思います。これ?

答えて

1

.uiファイルのsetupUi()の生成コードが次のような場合:

MyWidget *w = new MyWidget; 
w->setProperty(...); 

あなたのコンストラクタはまだ存在しないメタプロパティにアクセスしています。

QObject::event()を再実装してQDynamicPropertyChangeEventをキャプチャして、プロパティが初期化されたときに行動することができます。このコードは、動的プロパティの変更があるごとに時間と呼ばれることを念頭に置い

bool MyWidget::event(QEvent *ev) 
{ 
    if (ev->type() == QEvent::DynamicPropertyChange) { 
     if (QDynamicPropertyChangeEvent *propEv = static_cast<QDynamicPropertyChangeEvent *>(ev)) { 
      if (propEv->propertyName() == "someProperty") 
       ... 
     } 
    } 
} 

ベア。

より良い方法は、setupUi()などが呼び出され、動的プロパティが作成された後に、ウィジェットで必要な初期化を実行する関数を作成することです。

void setupMyWidget(MyWidget *w) 
{ 
    QString s = w->property("someProperty").toString(); 
    ... 
} 

一般的に、ダイナミックプロパティはコンストラクタのデフォルト値に割り当てられ、後で常に使用可能で非nullになります。

setProperty("someProperty", defaultValue); 
+0

私はあなたの答えを正しいとマークしましたが、それはうまく機能していましたが、別の方法で行ってしまいました。私はちょうどこれらのプロパティを持つ薄いサブクラスを作成し、ビルド時に利用できるようにし、それらをQtクリエータで宣伝しました。 uiファイルにプロパティを持ち、別のinit関数を処理する必要があるよりもきれいに思えました。 – voodoogiant

+0

確かに良いアプローチです。私はタブロイドに乗っていたので、タイピング速度のためにすぐに問題に遭遇しました。 –

関連する問題