Multithreading QT C++;。从其他线程更新UI元素

Multithreading QT C++;。从其他线程更新UI元素,multithreading,qt,user-interface,signals,slot,Multithreading,Qt,User Interface,Signals,Slot,我试图找到关于如何做到这一点的信息/代码,但网上的例子似乎都不适合我 有人能帮我在一个单独的线程上更新lineEdit吗,这样GUI主线程就不会挂起?如果我能弄明白这一点,我就可以轻松地遍历其他元素 我有一个测试场景: main window.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class B : public QObject { Q_OBJECT signals: vo

我试图找到关于如何做到这一点的信息/代码,但网上的例子似乎都不适合我

有人能帮我在一个单独的线程上更新lineEdit吗,这样GUI主线程就不会挂起?如果我能弄明白这一点,我就可以轻松地遍历其他元素

我有一个测试场景:

main window.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class B : public QObject {
  Q_OBJECT

 signals:
  void update_signal(bool, int);

 public:
  void handleEvent();
};

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {
  Q_OBJECT

 public:
  explicit MainWindow(QWidget *parent = nullptr);
  ~MainWindow();

 public slots:
  void m(bool, int);

 private:
  Ui::MainWindow *ui;
};

#endif
\ifndef主窗口
#定义主窗口
#包括
B类:公共质量对象{
Q_对象
信号:
无效更新_信号(bool,int);
公众:
void handleEvent();
};
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr);
~main窗口();
公众时段:
void m(bool,int);
私人:
Ui::MainWindow*Ui;
};
#恩迪夫
main window.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
  ui->setupUi(this);
}

MainWindow::~MainWindow() { delete ui; }

void B::handleEvent() {
  for (int x = 0; x < 100; x++) {
    emit update_signal(true, x);
  }
}

void MainWindow::m(bool x, int y) {
  QString tmpStr = "Rinning..." + QString::number(y);
  ui->lineEdit->setText(tmpStr);
}
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char* argv[]) {
  QApplication a(argc, argv);
  MainWindow w;
  w.show();

  B* b = new B();
  QObject::connect(b, SIGNAL(update_signal(bool, int)), &w, SLOT(m(bool, int)),
                   Qt::QueuedConnection);

  b->handleEvent();
  return a.exec();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)、ui(新ui::MainWindow){
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow(){delete ui;}
void B::handleEvent(){
对于(int x=0;x<100;x++){
发出更新_信号(真,x);
}
}
void主窗口::m(布尔x,整数y){
QString tmpStr=“Rinning…”+QString::number(y);
ui->lineEdit->setText(tmpStr);
}
main.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow) {
  ui->setupUi(this);
}

MainWindow::~MainWindow() { delete ui; }

void B::handleEvent() {
  for (int x = 0; x < 100; x++) {
    emit update_signal(true, x);
  }
}

void MainWindow::m(bool x, int y) {
  QString tmpStr = "Rinning..." + QString::number(y);
  ui->lineEdit->setText(tmpStr);
}
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char* argv[]) {
  QApplication a(argc, argv);
  MainWindow w;
  w.show();

  B* b = new B();
  QObject::connect(b, SIGNAL(update_signal(bool, int)), &w, SLOT(m(bool, int)),
                   Qt::QueuedConnection);

  b->handleEvent();
  return a.exec();
}
#包括
#包括“mainwindow.h”
int main(int argc,char*argv[]){
质量保证申请a(argc、argv);
主窗口w;
w、 show();
B*B=新的B();
QObject::连接(b,信号(更新信号(bool,int)),&w,插槽(m(bool,int)),
Qt::QueuedConnection);
b->handleEvent();
返回a.exec();
}
这看起来像这样:

所以,是的,目标是在另一个线程上更新这个标签,而不是挂起主线程。任何建议,为什么我的代码仍然在主线程上执行,都将不胜感激

问候。
Juris.

通过调用 QCoreApplication::processEvents(); 在handleEvent()的循环内。这将(很快)将控件交给事件循环,并允许处理事件。在这种情况下:先前发出的信号


对于中长期运行:为worker(逻辑)使用QThread,ui线程只能处理ui处理(输入和绘制)。

您提到了另一个线程,但到目前为止,我在您的代码中没有看到它。中有许多问题,因此,对于类似的问题,您是否尝试过搜索它们?我尝试过,我复制了其中一个问题,它告诉我们,当我们创建并连接信号+插槽并发出函数时,它应该同时运行。这是一个信号槽机制。我是Qt新手,所以任何帮助都会有很多参与。你没有看到他们一直在使用QThread吗?你能指出你研究过的帖子吗?你可以从中了解基本的
QThread
用法。你似乎误解了什么。Qt不会自动为您创建任何额外线程。同样,对于带有信号和插槽的基本Qt线程,您将需要一个完整的QObject子类,您将把它移动到另一个线程,并从那里发出信号。如果这不是线程练习,您可能应该使用QTimer。线程适用于同时使用多个内核的情况(性能方面),或者如果您可以让代码长时间只进行计算而不必担心阻塞GUI,那么代码将大大简化。