Ume*_* MS 11 qt signals signals-slots qt-signals
我正在开发一个将文件内容上传到服务器的应用程序.
要将文件上传到服务器,我使用的是"QNetworkAccessManager"类.由于它以异步方式工作,我通过使用QEventLoop将其更改为以同步方式工作.
Class FileTransfer
{
Public :
QNetworkAccessManager mNetworkManager;
Void Upload(QNetworkRequest request, QIODevice *data)
{
responce = mNetworkManager.put(request, data);
EventLoop.exec();
ReadResponce(responce);
}
Void Stop()
{
responce ->close();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的示例应用程序中,我有2个窗口.第一个选择文件,第二个显示进度.
当用户在第一个窗口中单击上传按钮时,将显示第二个窗口,然后我创建FileTransfer对象并开始上传.
当用户关闭表单时上传文件,然后在窗口的析构函数中,我调用" FileTransfer " 的停止,然后删除' FileTransfer '对象.
但是这里的Upload()函数还没有完成,所以它会崩溃.
请帮助我:如何等待'stop() '函数,直到Upload()函数完成
小智 19
从我可以从你的代码中看到的,你正在执行一个QEventLoop,但你实际上并没有将它的"退出"插槽连接到任何信号.以下面的例子为例,login是一个QHttp - 代码取自不同的东西 - 但原则适用.
/* Create the QEventLoop */
QEventLoop pause;
/* connect the QHttp.requestFinished() Signal to the QEventLoop.quit() Slot */
connect(&login, SIGNAL(requestFinished( int, bool )), &pause, SLOT(quit()));
/* The code that will run during the QEventLoop */
login.request(header,&logmein,&result);
/* Execute the QEventLoop - it will quit when the above finished due to the connect() */
pause.exec();
Run Code Online (Sandbox Code Playgroud)
这可以应用于你的代码,如果我没有弄错,就像这样......
/* connect the signal to the relevant slot */
connect(&mNetworkManager, SIGNAL(finished( QNetworkReply )), &EventLoop, SLOT(quit()));
/* Execute the code that will run during QEventLoop */
responce = mNetworkManager.put(request, data);
/* Execute the QEventLoop */
EventLoop.exec();
Run Code Online (Sandbox Code Playgroud)
如果我误解了您的查询,请道歉!我只是在休息后再次掌握qt,但我相信这就是你的意思!祝好运!
归档时间: |
|
查看次数: |
18401 次 |
最近记录: |