0

我正在尝试将函数的右值引用返回给 QVariant。它适用于 bool 和 int,但是当我传递一个字符串时,我得到一个“无效”的 QVariant。

我的功能:

QVariant &&AudioSettings::getValueFromTable(const QString &name)
{
    QSqlQuery query(_messengerDB);
    auto queryStr = QString("SELECT %1 FROM user_audio WHERE id = 1;").arg(name);
    if(query.exec(queryStr)){

        if(query.next()){
            qDebug() << "AudioSettings::getValueFromTable" << query.value(0);  //here I have a correct QString value => QVariant(QString, "Głośniki (USB Audio CODEC )")
            return std::move(query.value(0));

        } else {
            qDebug() << "AudioSettings::setValueToTable : No data for '" << queryStr << "'";
            return QVariant();
        }

    } else {
        qDebug()<<"AudioSettings::setValueToTable : Error during getting " << name << " form table user_audio.";
        qDebug() << query.lastQuery();
        qDebug() << query.lastError();
    }
    return QVariant();
}

当我打电话时:

QString &&AudioSettings::getAudioOut()
{
    auto value = getValueFromTable("audio_out");  //here I get an invalid QVariant
    return value.isNull() ? QString() : value.toString(); 
}

有效的是:

int AudioSettings::getRingtoneType()  //EDIT
{
    auto value = getValueFromTable("ringtone_type");  //EDIT, I am getting a QVariant with an int inside
    return value.isNull() ? 0 : value.toInt();
}

有谁知道为什么?

4

1 回答 1

2

如评论中所述,您正在返回一个悬空引用。所以你有未定义的行为,任何事情都可能发生。

在可行的情况下,QVariant 保存一个整数。我的猜测是你很幸运,保存 int 的内存没有被重写(或释放)。

对于 QString 你的运气用完了,实际的内容并没有存储在 QString 对象中,而是存储在堆上,一旦函数返回就被释放。剩下的就是一个 empty/null QString

解决方案:按值返回 QVariant。

于 2018-01-19T19:15:49.007 回答