Multithreading QT C++;。从其他线程更新UI元素
我试图找到关于如何做到这一点的信息/代码,但网上的例子似乎都不适合我 有人能帮我在一个单独的线程上更新lineEdit吗,这样GUI主线程就不会挂起?如果我能弄明白这一点,我就可以轻松地遍历其他元素 我有一个测试场景: main window.hMultithreading 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
#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,那么代码将大大简化。