Qt C ++从插槽GUI中的线程发出

时间:2016-08-04 14:08:47

标签: c++ qt

主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();

和主窗口中的连接槽流:

connect(SendPost, SIGNAL(SendLog(QString)), this, SLOT(setLogs(QString)));
如果我在线程中运行只接受结果qDebug()&lt;&lt; “GetRes:”+ GetRes;而所有......

请帮助,如何在线程和GUI之间创建信号槽连接? 谢谢!

1 个答案:

答案 0 :(得分:1)

网络请求已在工作线程中异步处理:这就是QNetworkAccessManager所做的事情。您不需要在混合中添加另一个线程。

对于其他CPU绑定的一次性任务,您应该通过QtConcurrent::run利用默认线程池。线程创建和销毁是昂贵的,并且线程池具有独特的位置,可以全面了解应用程序对工作线程的需求并最有效地管理它们的生命周期。对于I / O绑定任务,您应该使用第二个线程队列作为QtConcurrent::run的第一个参数传递。