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

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

最佳答案

如果从您的 .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);

关于c++ - Qt:我什么时候可以从 qtcreator 访问动态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36830957/

相关文章:

c - 我应该下载 Linux 版 libxml2 的哪个版本?

qt-creator - 在 Qt-Creator 中使用 openFrameworks

qt - Qt Creator:是否有类似VS解决方案的东西,您可以在其中添加项目并设置项目依赖项和构建顺序?

C++ 动态数组。为什么这个有效?

c++ - Qt 和 C++ QtPlugin - 可以处理什么样的插件?

c++ - QThread 中的 sleep 函数

c++ - 在 QWidgets 线程实例上运行 lambda 函数槽

c++ - std::array 构造函数继承

c++ - 在主线程之间共享一个变量

c# - QT 和 C# : Can I mix them for mobile development?