適切な解決策は、指示された@folibisとしてQQuickImageProviderを作成することです。しかし、私はQt5.5を使用しているので、私は(Qt5.6で導入された)QQuickAsyncImageProviderを作ることはできません。代わりに、QQuickImageProviderを構築するときに、QQmlImageProviderBase :: ForceAsynchronousImageLoadingにフラグを設定する必要があります。このフラグは、requestImageの呼び出しがメインのGUIスレッドをブロックしないようにします。
しかし、requestImageはImageが返されることを期待しており、そのスレッドをブロックせずにネットワークからイメージデータを取得することに挑戦しています。 QNetworkAccessManagerは信号で状態を返します.QQuickImageProviderはQObjectではないため、QNetworkReplyの信号を監視するヘルパークラスを作成しました。
class ReplyMonitor : public QObject
{
Q_OBJECT
public:
ReplyMonitor(QNetworkAccessManager *);
public Q_SLOTS:
void handleReplyFinished();
void handleSslErrors(QNetworkReply *, const QList<QSslError> &);
void handleAuthenticationRequired(QNetworkReply *, QAuthenticator *);
public:
bool finished;
};
と
ReplyMonitor::ReplyMonitor(QNetworkAccessManager *mgr)
: finished(false)
{
connect(mgr, SIGNAL(finished(QNetworkReply *)), this, SLOT(handleReplyFinished()));
connect(mgr, SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)),
this, SLOT(handleSslErrors(QNetworkReply*, const QList<QSslError> &)));
connect(mgr, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)),
this, SLOT(handleAuthenticationRequired(QNetworkReply*, QAuthenticator*)));
}
void ReplyMonitor::handleReplyFinished()
{
finished = true;
}
次にrequestImage()
に私はOM finished
をチェックして、私は
if (reply->error() == QNetworkReply::NoError)
{
image.loadFromData(reply->readAll());
}
を返すようにイメージを作成する前に
while (!monitor->finished)
{
QCoreApplication::processEvents(QEventLoop::AllEvents, 1000);
}
を呼び出しますQNetworkRequestを作成する詳細がよく書かれています。
'cid.data'は、生の画像データではなくRGBA順の画像ピクセルデータでなければなりません。サーバーからbase64でエンコードされた文字列としてイメージを受け取ることはできますか?この場合、イメージを 'img.source = 'data:image/png; base64、...ここでコード化されたデータとして作成することができます。別の回避策は、カスタムイメージプロバイダを使用することです。 – folibis
あなたが知っているのは、アップルの@folibisに対する答えです。 – BaCaRoZzo
base64でエンコードされた画像データを取得できないため、カスタム画像プロバイダに切り替える必要があります。 CanvasImageDataのフォーマットを明確にしていただきありがとうございます。私の質問に対する回答を自由に作成してください。私はあなたのためにそれをマークします。 – Bargonaut