2014-12-13 27 views
2

我創建圍繞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

如何將任何一種編程語言規範涵蓋了這個合理的包裝?對或錯?好,還是不行?正確或不正確?一個還是零? 1還是0?等等可能有太多的字符串變化。 – lpapp 2014-12-13 07:59:14

+0

好點。出於某種原因,我期待QML引擎在將它交給Javascript之前將我的bool-string轉換爲bool。但那真的沒有意義,實際上也很模糊。 – 2014-12-13 17:03:50

回答

相關問題