2016-04-25 37 views
0

我在QtCreator中有幾個小部件,它們是從同一個類中提升的。但是,我希望他們在兩者之間有細微的差異,所以我想通過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 
} 

所以我的問題人們如何使用這些屬性構造類型的東西?我可以在initializeGL中做到這一點,但這似乎很奇怪,因爲這些屬性可能與初始化OpenGL沒有關係,我想我也可以連接到屬性更改信號並在那裏執行。 ?此

回答

1

如果從您的.ui文件setupUi()生成的代碼確實是這樣的:

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

然後你的構造函數訪問一個不存在的元屬性。

您可以重新執行QObject::event()以捕獲QDynamicPropertyChangeEvent s,讓您在屬性初始化後採取行動。

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

記住,這個代碼將被稱爲時候有一個動態屬性變化。

更好的方法可能是創建一個函數,以便在調用等等被調用並創建動態屬性後,對小部件執行必要的初始化。

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

通常,動態屬性在構造函數中被分配一個默認值,以便它們在以後總是可用且非空。

setProperty("someProperty", defaultValue); 
+0

我標記你的答案是正確的,因爲它的工作原理,但我最終採取了不同的方法。我剛剛創建了具有這些屬性的瘦子類,以便在構建時可用,並在Qt創建者中提升這些屬性。看起來比使用ui文件中的屬性更清潔,並且不得不處理另一個init函數。 – voodoogiant

+0

絕對是更好的方法。由於打字速度,我當時正在一個小報上,因此直接遇到了問題。 –

相關問題