2016-04-25 35 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

绝对是更好的方法。由于打字速度,我当时正在一个小报上,因此直接遇到了问题。 –

相关问题