Как проверить, существует ли динамическое свойство

Я использую функцию 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
}

person Lion King    schedule 20.06.2014    source источник


Ответы (2)


Если свойство не существует, метод QObject::property возвращает недопустимый вариант. Это задокументировано.

Таким образом:

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

Примечание: сравнивать что-либо с true либо совсем лишнее, либо где-то признак сломанного дизайна. В вашем коде не должно быть ни ... == true, ни ... == false.

person Kuba hasn't forgotten Monica    schedule 20.06.2014
comment
Я думаю, что ваш способ проще и ближе всего к моему коду. - person Lion King; 20.06.2014
comment
Да ладно, а как отличить свойство unset от свойства установленного в QVariant()? - person Tomáš Zato - Reinstate Monica; 05.09.2016
comment
Нет необходимости различать их. Если вы считаете, что вам это нужно, вам нужно использовать пользовательский тип данных и только обернуть его в вариант. - person Kuba hasn't forgotten Monica; 06.09.2016
comment
@TomášZato Неустановленное динамическое свойство имеет значение null QVariant. Установленное свойство будет иметь некоторое значение, хотя само значение может быть нулевым. Например. скажем, что мы установили вариант QString{}. QVariant::isNull() является ложным, но QVariant::toString().isNull() является истинным, потому что вариант был установлен со строковым значением, которое просто оказалось нулевым - однако вариант не заботится об этом. С точки зрения варианта, он либо установлен и, следовательно, не равен нулю, либо не установлен и, следовательно, равен нулю. Вложенные типы данных могут иметь собственное различие null/non-null, но это необязательно. - person Kuba hasn't forgotten Monica; 20.08.2018

Проблема в том, что вы пытаетесь напрямую проверить свойство QVariant, в то время как в вашем случае оно даже не уверено, существует ли оно.

Я бы лично использовал любое из приведенных ниже решений в зависимости от вашего точного контекста в реальной программе.

Если хотите, замените заполнитель переменной предпочитаемым именем свойства.

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

or:

QList<QByteArray> dynamicPropertyNames =
    ui->mdiArea->activeSubWindow()->dynamicPropertyNames();
if (dynamicPropertyNames.contains(myPropertyName))
    qDebug() << myPropertyName << "exists.";
person lpapp    schedule 20.06.2014
comment
Спасибо за ваш ответ. Я также выиграл от вашего кода. - person Lion King; 20.06.2014
comment
@LionKing: хорошо, кстати, я думал об этом, пока ехал домой, что вы, вероятно, могли бы также запросить свойство напрямую и посмотреть, существует ли оно таким образом. Я обновил ответ. - person lpapp; 20.06.2014