Я показываю изображение в метке qt. Ниже мой код:Получение Pixmap является пустой pixmap при вызове функции 500 раз
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 * ответ)' в случае ' ответ' имеет ошибку. Вы пропустите ответ, не называя 'reply-> deleteLater();' в этом случае. Обычно это первое, что я вызываю в таких слотах, что безопасно, так как ответ не будет фактически удален до выхода из слота, поэтому нет необходимости только называть его в конце. –