【问题标题】:How to check whether or not a dynamic property exists如何检查动态属性是否存在
【发布时间】:2014-08-11 04:51:14
【问题描述】:

我已经使用setProperty 函数将动态属性设置为对象。
但我想在其他地方检查创建的属性是否存在。

我做了什么:
设置属性时:

QString fileDlg = QFileDialog::getOpenFileName(this, "Open File", "F://","Text Files(*.txt)");
QWidget *widget = new QWidget(this);
QMdiSubWindow *mdiWindows = ui->mdiArea->addSubWindow(widget);
mdiWindows->setProperty("filePath", fileDlg);

检查属性是否存在时:

QMdiSubWindow *activeWindow = ui->mdiArea->activeSubWindow();
if(activeWindow->property("filePath") == true){
    // code here
}

【问题讨论】:

    标签: c++ qt qt5 qtcore qobject


    【解决方案1】:

    问题是您试图直接检查 QVariant 属性,而它甚至不确定它是否存在于您的案例中。

    根据您在实际程序中的确切上下文,我会亲自使用以下任一解决方案。

    如果您愿意,请将变量占位符替换为您喜欢的属性名称。

    QVariant myPropertyValue =
        ui->mdiArea->activeSubWindow()->property(myPropertyName);
    if(myPropertyValue.isValid())
        qDebug() << myPropertyName << "exists.";
    

    或:

    QList<QByteArray> dynamicPropertyNames =
        ui->mdiArea->activeSubWindow()->dynamicPropertyNames();
    if (dynamicPropertyNames.contains(myPropertyName))
        qDebug() << myPropertyName << "exists.";
    

    【讨论】:

    • 感谢您的回答。我也从您的代码中受益。
    • @LionKing:很好,顺便说一句,我在骑车回家时正在考虑,您可能也可以直接查询该属性,看看它是否存在。我更新了答案。
    【解决方案2】:

    如果该属性不存在,QObject::property 方法会返回一个无效的变体。这是documented

    因此:

    QVariant filePath = activeWindow->property("filePath");
    if (filePath.isValid()) {
      ...
    }
    

    旁注:将任何内容与true 进行比较要么完全是多余的,要么是某处设计损坏的迹象。您的代码中不应有 ... == true... == false

    【讨论】:

    • 我认为你的方式更简单,并且最接近我的代码。
    • 哦,好吧,如何区分未设置的属性和设置为QVariant()的属性?
    • 没有必要区分它们。如果您认为需要,则需要使用自定义数据类型,并且仅将其包装在变体中。
    • @TomášZato 未设置的动态属性为空 QVariant。已设置的属性将具有某些值,尽管该值本身可能为空。例如。假设我们将变量设置为QString{}QVariant::isNull() 为假,但QVariant::toString().isNull() 为真,因为该变体设置了一个恰好为空的字符串值——尽管该变体并不关心这一点。从变体的角度来看,它要么是设置的,因此是非空的,要么是未设置的,因此是空的。封闭的数据类型可能有自己的“空/非空”区别,但它是可选的。
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多