Qt 5 の未来は明るいブログ

Twitter4QML の大量の警告を修正しました

Published: 2014-03-24 / Last modified: 2014-03-24

艦メモ のおかげで結構ビルドされるようになった Twitter4QML ですが、もともと Qt 4 で開発していたという歴史的な理由により Qt 5 でビルドすると 大量に警告が出る 状態だったのを修正しました。

あまりいろいろな環境ではテストしていないので、問題があったらすぐにお知らせ下さい。

'QString::QString(const char*)' is deprecated

Qt 5 では QString(const char*) を使うと警告が出るようになりました。

// ASCII compatibility

#ifndef QT_NO_CAST_FROM_ASCII
    inline QT_ASCII_CAST_WARN QString(const char *ch)
        : d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1))
    {}
    ...
#endif

ここで、QT_ASCII_CAST_WARN は以下のように定義されています。デフォルトでは QT_ASCII_CAST_WARNINGS が定義されているため、明示的に #undef しない限りは「廃止されました」という警告が出るようになっています。

#ifdef QT_ASCII_CAST_WARNINGS
#  define QT_ASCII_CAST_WARN Q_DECL_DEPRECATED
#else
#  define QT_ASCII_CAST_WARN
#endif

このため、QString(const char *)のコンストラクタを明示的に使用している場所や暗黙的に呼ばれている場所すべてで警告が出ていました。

Qt 5 では、QString::fromUtf8() とか QString::fromLatin1(const char * str, int size = -1) を使いましょう、文字列リテラルの場合は QStringLiteral(str) マクロを使いましょう、という感じなので、とりあえずそれにしたがって直しました。

Qt 4 で今まで

QVariantMap map;
map["key"] = "value";

と書いていたコードは、

QVariantMap map;
map[QStringLiteral("key")] = QStringLiteral("value");

と書かないと警告がでるんです。無駄に面倒くさいですねー。

QAlgorithmsPrivate::qReverse

今まで配列の順番を逆順にするのに QAlgorithmsPrivate::qReverse() という非公式な API を使っていたのですが、Change I3358e44b: Used QT_DEPRECATED_X in QtAlgorithms という変更により正式に廃止されました。代わりに std::reverse を使ってねというメッセージを親切に出してくれているので、そちらに置き換えました。