2017-06-24 48 views
0

我想使用模板方法value()將存儲字符串的QVariant轉換爲值。用toInt(),toDouble()等其他方法也可以做同樣的事情。無法檢查值爲()的QVariant轉換

我現在的問題是,使用例如toDouble(bool *ok = Q_NULLPTR)我可以通過作爲參數指向布爾檢查轉換是否順利..但我不能執行此檢查與value()。這裏有一個重現它的小例子。

#include <QVariant> 
#include <QDebug> 

int main() 
{ 
    QVariant v; 
    QString str = "300.0"; //Valid number 
    v.setValue(str); 

    QVariant v2; 
    QString str2 = "3kk.4f"; //Invalid number 
    v2.setValue(str2); 

    if(v.canConvert<double>()) { 
     qDebug() << "Ok QString to double is permitted"; 
     qDebug() << "Result: " << v.value<double>(); 
    } 

    if(v2.canConvert<double>()) { 
     qDebug() << "Yes QString to double is already permitted"; 
     qDebug() << "Result: " << v2.value<double>(); 
     //Oh oh result is 0.0 but is string invalid or it really contain value 0 ? 
    } 

    return 0; 
} 

如何做到使用模板方法value()這種轉換檢查一些建議嗎?

+0

你不能在'value()'之前調用'convert()'並檢查'convert()'的返回值嗎? – peppe

+0

'convert()'需要一個'int targetTypeId',它在當前版本的Qt(5.9)中被標記爲過時,並且它的使用是不鼓勵的[here](http://doc.qt.io/qt-5/qvariant- obsolete.html)。此外,沒有模板方法來保持這個'targetTypeId',並且在我的應用程序中,類型來自模板。 – Elia

+1

呃,不,不要用*表示枚舉。改爲使用'qMetaTypeId ()'。請參閱https://doc.qt.io/qt-5/qmetatype.html#qMetaTypeId – peppe

回答

2

您可以使用QVariant::convert(int)傳遞目標類型的元類型id,您可以通過qMetaTypeId<T>()獲取該類型的id。例如。

QVariant valid("123.4"); 
QVariant invalid("123x.y4"); 

qDebug() << "Types:"; 
qDebug() << valid.typeName(); // "QString" 
qDebug() << invalid.typeName(); // "QString" 

// there is a registered QString->double conversion, 
// so these will return true 
qDebug() << "Can convert:"; 
qDebug() << valid.canConvert<double>(); // true 
qDebug() << invalid.canConvert<double>(); // true 

qDebug() << "Convert valid:"; 
if (!valid.convert(qMetaTypeId<double>())) 
    qDebug() << "Conversion failed"; // gets NOT printed 

qDebug() << valid.typeName(); // "double" 
qDebug() << valid.isNull(); // false 
qDebug() << valid.value<double>(); // 123.4 

qDebug() << "Convert invalid:"; 
if (!invalid.convert(qMetaTypeId<double>())) 
    qDebug() << "Conversion failed"; // is printed 

qDebug() << invalid.typeName(); // "double" 
qDebug() << invalid.isNull(); // true 
qDebug() << invalid.value<double>(); // 0