イメージをqtラベルで表示しています。以下は私のコードですPixmapを取得すると、関数を呼び出す際のnull pixmapです。
void MyClass::onPushButtonClicked(QString myurl)
{
this->setCursor(Qt::WaitCursor);
ui.qtImageLabel->clear();
qDebug()<<QTime::currentTime()<<"MyClass: onPushButtonClicked";
QNetworkAccessManager *qnam_push_button_clicked_show_image;
QNetworkReply *reply;
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QUrl url(myurl);
request.setUrl(url);
qnam_push_button_clicked_show_image = new QNetworkAccessManager(this);
if(qnam_push_button_clicked_show_image)
{
QObject::connect(qnam_push_button_clicked_show_image, SIGNAL(finished(QNetworkReply*)),
this, SLOT(onPushButtonClickedRequestCompleted(QNetworkReply*)));
reply = qnam_push_button_clicked_show_image->post(request, url.encodedQuery());
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
}
}
void MyClass::onPushButtonClickedRequestCompleted(QNetworkReply *reply)
{
qDebug()<<QTime::currentTime()<<"MyClass: onPushButtonClickedRequestCompleted request completed";
if (reply->error() != QNetworkReply::NoError)
{
qDebug() << "Error in" << reply->url() << ":" << reply->errorString();
this->setCursor(Qt::ArrowCursor);
return;
}
QByteArray data = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(data);
int width;
int height;
//application size can be changed
QRect rec = QApplication::desktop()->screenGeometry();
height = rec.height();
width = rec.width();
qDebug()<<QTime::currentTime()<<width<<","<<height;
QSize *size = new QSize(width,height);
if(size)
{
QPixmap scaledPixmap = pixmap.scaled(*size);
ui.qtImageLabel->setPixmap(scaledPixmap);
}
if(size)
{
delete size;
size = NULL;
}
data.clear();
this->setCursor(Qt::ArrowCursor);
reply->deleteLater();
return;
}
クリックすると、サーバーに要求が送信され、サーバーから受信した別のイメージが表示されます。それが500回を超えないならそれはうまくいきます。最初にそれを超えるとこのエラーが表示されました
QPixmap::scaled: Pixmap is a null pixmap
イメージを表示していません。その後、誰かが画像の要求を再度送信すると、次のエラーが表示されます。 Qtがイベントハンドラからスローされた例外を検出しました。イベントハンドラからの例外を投げることは、Qtではサポートされていません。 を再度実装してQApplication::notify()
を実装し、そこにすべての例外をキャッチする必要があります。
上記のコードでエラーが発生していません。誰かが私にこれを解決する方法を教えてもらえますか?
)とあなたが ''場合は 'onPushButtonClickedRequestCompleted(QNetworkReply *返信)から早期帰国しているときに別のマイナーリークがあります幸運リークを修正かどうかをチェックするために、そのボタンに別の500回を押すと助けましたreply'にエラーがあります。あなたは 'reply-> deleteLater();'を呼ばないことでリークしています。通常、このようなスロットでは最初に呼び出されますが、スロットが終了するまで返信が実際に削除されないので安全です。最後に呼び出す必要はありません。 –