【问题标题】:Qt: when can I access dynamic properties from qtcreator?Qt:我什么时候可以从 qtcreator 访问动态属性?
【发布时间】:2016-04-25 01:53:50
【问题描述】:

我在 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 无关。我想我也可以连接到属性更改信号并在那里进行。这是处理这个问题的常用方法吗?

【问题讨论】:

    标签: c++ qt qt-creator


    【解决方案1】:

    如果从您的 .ui 文件中为 setupUi() 生成的代码执行以下操作:

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

    那么您的构造函数正在访问一个尚不存在的元属性。

    您可以重新实现QObject::event() 以捕获QDynamicPropertyChangeEvents,让您在属性初始化后采取行动。

    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);
    

    【讨论】:

    • 我将您的答案标记为正确,因为它有效,但我最终采用了不同的方法。我刚刚创建了仅具有这些属性的瘦子类,因此它们在构建时可用,并在 Qt creator 中提升了它们。看起来比在 ui 文件中拥有属性并且必须处理另一个 init 函数更干净。
    • 绝对是更好的方法。我在一个小报上,所以由于打字速度而直接解决了问题。
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2012-10-30
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多