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

Използвам функцията 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
О, добре, и как да се направи разлика между ненастроено свойство и свойство, зададено на 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