[英]Qt C ++ emit from the thread, in the slot GUI
主mainwindow类(GUI)中有一个插槽,用于在QTextBrowser中显示数据:
void MainWindow::setLogs(QString param, QString text) {
qDebug()<<text;
ui->Logs->append(text);
}
有一个在单独的线程中运行的类,进行POST搜索并在QTextBrowser中插入数据:
QNetworkRequest request(apiUrl);
request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0");
request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
request.setRawHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
request.setRawHeader("Accept-Encoding", "identity");
request.setRawHeader("Connection", "keep-alive");
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
reply = manager.post(request, "data="+data);
connect(reply, &QNetworkReply::finished,this, &MakePost::getReplyFinished);
connect(reply, &QNetworkReply::readyRead, this, &MakePost::readyReadReply);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(GetError()));
void MakePost::readyReadReply()
{
QString GetRes = QString::fromUtf8(reply->readAll());
qDebug() << "GetRes: " + GetRes;
emit SendLog(GetRes);
}
调用线程:
QThread *postThread = new QThread;
MakePost *sendPost = new MakePost();
sendPost->SetParam(Data, SubUrl, requestString);
sendPost->moveToThread(postThread);
sendPost->manager.moveToThread(postThread);
connect(postThread, SIGNAL(started()), sendPost, SLOT(MakePostSignal()));
postThread->start();
和mainwindow中的connect slot-stream:
connect(SendPost, SIGNAL(SendLog(QString)), this, SLOT(setLogs(QString)));
如果我在线程中运行,则所有线程都工作正常,仅接收结果qDebug()<<“ GetRes:” + GetRes; 和所有 ...
请帮忙,如何在线程和GUI之间建立信号插槽的连接? 谢谢!
网络请求已经在工作线程中异步处理:这就是QNetworkAccessManager
所做的。 您无需在混合中添加其他线程。
对于其他受CPU限制的一次性任务,您应该通过QtConcurrent::run
来利用默认线程池。 线程的创建和销毁非常昂贵,并且线程池的位置独特,可以全局了解您的应用程序对工作线程的需求,并最有效地管理其生命周期。 对于受I / O约束的任务,您应该使用第二个线程队列,该队列作为第一个参数传递给QtConcurrent::run
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.