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

问题描述 投票:-2回答:1

我正在尝试查找有关如何执行此操作的信息/代码,但网上的示例似乎都不适用于我。

有人可以帮助只在一个单独的线程上更新qlineEdit,到主GUI线程不挂?如果我能解决这个问题,我可以轻松地解决其他问题。

我有这个测试场景:

mainwindow.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

mainwindow.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);
}

main.cpp中

#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();
}

这看起来像这样:

enter image description here

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

问候。法学。

multithreading qt user-interface signals slot
1个回答
1
投票

您可以通过调用QCoreApplication :: processEvents()来使您的示例在没有任何其他线程的情况下工作;在handleEvent()的循环内。这将(很快)产生对事件循环的控制并允许处理事件。在那种情况下:先前发出的信号。

对于中长期运行:对工作者使用QThread(逻辑),ui-thread只处理ui处理(输入和绘制)。

© www.soinside.com 2019 - 2024. All rights reserved.