【问题标题】:How do you port QUrl addQueryItem to Qt5's QUrlQuery?如何将 QUrl addQueryItem 移植到 Qt5 的 QUrlQuery?
【发布时间】:2013-01-22 18:12:02
【问题描述】:

Qt 4 中,使用QUrl 的以下代码有效:

QUrl u;
foreach (const settings::PostItem & pi, settings.post)
    u.addQueryItem(pi.name, pi.value);
postData = u.encodedQuery();

注意事项:此代码来自wkhtmltopdfpostData 是一个 QByteArray。

但是,Qt 5 不再具有addQueryItem() 功能。你如何移植这段代码?

【问题讨论】:

    标签: qt qt5 qurl


    【解决方案1】:

    为了确保与Qt 4 的兼容性,请在文件顶部添加以下行:

    #if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
    #   include <QUrlQuery>
    #endif
    

    这意味着如果您针对 Qt 5.0.0 或更高版本进行编译,QUrlQuery 将仅是 #included。

    然后在问题中指定的代码上方添加以下行:

    #if QT_VERSION < QT_VERSION_CHECK(5,0,0)
    

    然后将此代码插入问题中指定的代码下方:

    #else
        QUrlQuery q;
        foreach (const settings::PostItem & pi, settings.post)
            q.addQueryItem(pi.name, pi.value);
        postData = q.query(QUrl::FullyEncoded).toUtf8();
    #endif
    

    注意:使用toUtf8() 是因为postDataQByteArray,而query() 返回QStringtoAscii()Qt 5 中已弃用,但 UTF-8 是 ASCII 的子集,仅在必要时使用 Unicode 字符。

    编辑:如果您想使用具有 URL 部分的真实 QUrl,请添加:

     QUrl url;
     url.setQuery(q);
    

    【讨论】:

    • 如果url 已经有我想要添加的部分查询,这将如何改变?我看不到在 QUrl 中附加到现有查询的方法。
    • 我在发布后立即意识到您可以使用现有 url 初始化 QUrlQuery 以避免覆盖现有查询,如下所示:QUrlQuery q(url); q.addQuery(…); url.setQuery(q);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多