有没有办法将 QVariant 与 QVector 一起使用?

Posted

技术标签:

【中文标题】有没有办法将 QVariant 与 QVector 一起使用?【英文标题】:Is there a way to use QVariant with QVector? 【发布时间】:2017-12-15 17:58:37 【问题描述】:

有没有办法将QVariantQVector 一起使用?

我需要实现一个函数来比较两个向量,例如:

#include <QDebug>
#include <QVector>
#include <QString>

bool compareVectors(QVector<QVariant> vec1, QVector<QVariant> vec2)

    qDebug() << "Comparing vectors!";

    if( vec1 != vec2 )
    
        qDebug() << "The vectors are different!";
        return false;
    

    qDebug() << "The vectors are equal!";
    return true;


int main()

    QVector<double> v1;
    QVector<double> v2;
    v1 << 1 << 2;
    v2 << 3 << 4;

    QVector<QString> v3;
    QVector<QString> v4;
    v3 << "1" << "2";
    v4 << "3" << "4";

    compareVectors(v1, v1);
    compareVectors(v3, v4);

    return 0;

参数传递的两个向量将始终具有相同的数据类型,例如:

compareVectors(QVector<int>, QVector<int>);
compareVectors(QVector<double>, QVector<double>);
compareVectors(QVector<QColor>, QVector<QColor>);
compareVectors(QVector<QString>, QVector<QString>);

当我尝试运行上述代码时,我收到以下错误消息:

错误:没有用于调用“compareVectors”的匹配函数

注意:我使用的是 Qt 5.3。

【问题讨论】:

使用std::vector,而不是QVector。 Qt 容器类是遗留的东西,通常性能比标准容器差,有各种奇怪的怪癖,不再真正维护,甚至 Qt 人都建议不要使用它们,除非 API 边界强迫你这样做。 【参考方案1】:

当参数类型为QVector&lt;QVariant&gt; 时,您不能使用QVector&lt;int&gt;(或QVector&lt;double&gt;)。

我建议将compareVectors 设为函数模板。

template <typename T>
bool compareVectors(QVector<T> vec1, QVector<T> vec2)

    qDebug() << "Comparing vectors!";

    if( vec1 != vec2 )
    
        qDebug() << "The vectors are different!";
        return false;
    

    qDebug() << "The vectors are equal!";
    return true;

【讨论】:

以上是关于有没有办法将 QVariant 与 QVector 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

带结构的 QVector - 性能 + 最佳实践

如何将 QVector 与多个对象一起使用

如何将 QVariant::fromValue 与 QString 一起使用?

当 QDataStream 没有这种方法时,为啥可以将 QVariant 写入 QDataStream?

在运行时更改 QML 小部件

QVector 与具有参数的自定义对象?