问:我什么时候可以从qtcreator访问动态属性?

时间:2016-04-25 01:53:50

标签: c++ qt qt-creator

我在QtCreator中有几个小部件,它们是从同一个类中提升的。但是,我希望他们在两者之间有细微差别,所以我想在UI文件中传递一些差异,推广类可以用来区分自己。动态属性似乎是在UI编辑器中实现的方式我为每个提升的小部件分配了动态属性。在我尝试访问该属性的代码中,但注意到它似乎只在构造后可用(可能是因为Qt在创建对象后调用setProperty()

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 个答案:

答案 0 :(得分: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();
    ...
}

通常,动态属性在构造函数中被赋予默认值,以便它们始终可用且以后不为空。

setProperty("someProperty", defaultValue);