我創建圍繞QSettings一個設置類的包裝,提供了QML訪問下面的方法:QML引擎不會隱式轉換布爾串QVarient爲bool財產
Q_INVOKABLE void setValue(Key key, const QVariant &newValue);
Q_INVOKABLE QVariant value(Key key);
在用戶界面中,有複選框情況是這樣的:
CheckBox {
checked: Settings.value(Settings.KeySomeBoolSettings)
}
QSettings負荷布爾值成的QVariant與QString類型爲「真」或「假」(這是罰款)。問題是當QML根據checked屬性的需要將其隱式轉換爲布爾表達式時,它總是轉換爲true(即使它實際上是「false」)。我發現一個解決方法來檢測Settings :: value()中的QVariant實際上是一個布爾值。
QVariant Settings::value(Key key)
{
QVariant value = mSettings->value(stringNameForKey(key), mDefaultValues[key]);
//this block is the workaround
if (QString(value.typeName()) == "QString" &&
(value.toString() == "false" || value.toString() == "true"))
return QVariant(value.toBool());
return value;
}
當檢測到時,實際的QVariant返回是的QVariant(value.toBool()),這導致內部類型實際上是布爾。所以當內部類型是bool時,QML可以使隱式轉換正確。從我所知道的情況來看,QML將字面上的變量作爲一個字符串,然後將其轉換爲一個布爾值,除非字符串爲空,否則它總是爲真。這是一個錯誤,還是我做錯了什麼?
如何將任何一種編程語言規範涵蓋了這個合理的包裝?對或錯?好,還是不行?正確或不正確?一個還是零? 1還是0?等等可能有太多的字符串變化。 – lpapp 2014-12-13 07:59:14
好點。出於某種原因,我期待QML引擎在將它交給Javascript之前將我的bool-string轉換爲bool。但那真的沒有意義,實際上也很模糊。 – 2014-12-13 17:03:50