현재 Qt 스레드에서 문제가 발생합니다.Qt QThread의 신호와 슬롯
QThread에서 파일 목록을 업로드해야하지만 분명히 업로드가 작동하지 않으며 슬롯이 호출되지 않습니다. 스레드의 메서드를 넣으면 완벽하게 작동합니다.
void UploadThread::sendFile(const QString & path)
{
QFreeDesktopMime mime;
QNetworkAccessManager *manager = new QNetworkAccessManager;
QFileInfo fInfo(path);
QNetworkRequest request(QUrl("http://my-url/"));
QNetworkReply *reply;
QString bound = "---------------------------723690991551375881941828858";
QByteArray data(QString("--"+bound+"\r\n").toAscii());
data += "Content-Disposition: form-data; name=\"action\"\r\n\r\n";
data += "\r\n";
data += QString("--" + bound + "\r\n").toAscii();
data += "Content-Disposition: form-data; name=\"file\"; filename=\""+fInfo.fileName()+"\"\r\n";
data += "Content-Type: "+mime.fromFile(path)+"\r\n\r\n";
QFile file(fInfo.absoluteFilePath());
file.open(QIODevice::ReadOnly);
data += file.readAll();
data += "\r\n";
data += QString("--" + bound + "\r\n").toAscii();
data += QString("--" + bound + "\r\n").toAscii();
data += "Content-Disposition: form-data; name=\"desc\"\r\n\r\n";
data += "Description for my image here :)\r\n";
data += "\r\n";
request.setRawHeader(QString("Accept-Encoding").toAscii(), QString("gzip,deflate").toAscii());
request.setRawHeader(QString("Content-Type").toAscii(),QString("multipart/form-data; boundary=" + bound).toAscii());
request.setRawHeader(QString("Content-Length").toAscii(), QString::number(data.length()).toAscii());
reply = manager->post(request, data);
QObject::connect(reply, SIGNAL(uploadProgress(qint64,qint64)), currentThread(), SLOT(receiveUploadProgress(qint64, qint64)));
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), currentThread(), SLOT(uploadFinished(QNetworkReply*)));
}
그리고 여기 내 슬롯은 다음과 같습니다 :
여기void UploadThread::run()
{
for (int i = 0; i < Window::_listUpload.size(); i++) {
qDebug() << Window::_listUpload[i].getPath();
this->sendFile(Window::_listUpload[i].getPath());
}
}
가 sendfile을() 방법 : 여기
는 run() 메소드입니다void UploadThread::uploadFinished(QNetworkReply *reply)
{
_isFinished = true;
}
void UploadThread::receiveUploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
qDebug() << bytesSent << " " << bytesTotal;
}
당신이 볼 수행 내 코드에 문제가 있습니까? 감사합니다.
uploadProgress() 및 finished() 신호를 다시 구현할 필요가 없습니다.이 신호는 QNetworkReply 및 QNetworkAccessManager에서 각각 구현됩니다. 나는 그들을 수동으로 방출 할 필요가 없다. 그래서, 내 코드가 작동하지, 안돼? –
안녕하세요, 맞습니다. 나는 당신의 코드를 잘못 해석했다 ... – mreithub