簡體   English   中英

Qt C ++從插槽GUI中的線程發出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM