首页 文章

QVariant中的自定义类型转换为空字符串

提问于
浏览
3

我正在编写一个词法扫描程序,可以从某些输入中生成令牌流 . 这些令牌具有类型和值 . 由于我使用Qt,我选择将令牌数据存储为 QVariant . 这适用于非自定义类型的令牌数据 .

不幸的是,我有几个存储在令牌内的自定义类型 . 令牌具有 toString() 函数,该函数输出令牌描述(用于调试),但对于具有自定义类型数据的所有令牌,此函数给出空字符串 . 代码如下:

Test.h:

struct Test
{
    QString value_;

    Test(const QString& value = "");
    QString toString();
};

Q_DECLARE_METATYPE(Test)

Token.h:

struct Token
{
    TokenType type_;
    QVariant value_;
...
    virtual QString toString() const;
};

Token.cpp:

QString Token::toString() const
{
    QStringList sl;
    sl << "Token(" << ::toString(type_) << ", ";
    sl << value_.toString() << ")";
    return sl.join("");
}

扫描仪的输出示例:

"Token(TT_TEST, )" 
"Token(TT_PLUS, +)" 
"Token(TT_NUMBER, 5)" 
"Token(TT_end, #)"

TT_TEST 令牌包含一个Test类,我希望该变体可以打印它's value. Unfortunately this does not work, and I'已经尝试了很多无效的解决方案 . 我目前的解决方法如下所示:

template <typename T>
bool writeToStringList(QStringList& sl, QVariant v)
{
    if (!v.canConvert<T>()) return false;
    sl << v.value<T>().toString();
    return true;
}

和修改后的 toString() 函数:

sl << "Token(";
sl << ::toString(type_) << ", ";
if (!writeToStringList<Test>(sl, value_)) {
    sl << value_.toString();
}

我必须为我的所有自定义类型执行此操作,这些类型只是感觉非常笨拙和错误 .

我认为必须有一个更好的解决方案来解决这个问题 . 任何人都可以:

  • 告诉我如何以更好的方式解决 QVariant 的问题,或者

  • 提出了一个完全不同的解决方案,没有 QVariant . (我之前有一个模板解决方案,但我遇到了不同的问题,所以如果有建议,我需要一个例子) .

1 回答

  • 3

    事实上,Q_DECLARE_METATYPE()足以在QVariant中启用自定义类型的聚合 . 这不包括隐式类型转换和QVariant上下文中的比较等方面 . Qt5假设,为了便于隐式转换为QString,您可以执行以下操作:

    #include <QMetaType>
    
    struct Token {
        QString _value;
    };
    
    Q_DECLARE_METATYPE( Token* );
    
    QString tokenToString( Token* t ) {
       return t->_value );
    }
    
    int main(int argc, char* argv[]) {
        QMetaType::registerConverter<Token*,QString>( tokenToString );
    
        Token t = { QString("hello") };
        QVariant value;
        value.setValue( &t );
        std::cout << value << std::endl;
    }
    

    这当然也可以(并且更多保存) Q_DECLARE_METATYPE( MyType ) 并直接聚合QVariant中的Token实例而不是指向Token的指针 .

    另见this post from the Qt forum

相关问题