我正在尝试查找有关如何执行此操作的信息/代码,但网上的示例似乎都不适用于我。
有人可以帮助只在一个单独的线程上更新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();
}
这看起来像这样:
所以是的,目标是在另一个线程上更新标签,而不是挂起主线程。任何建议,为什么我的代码仍然在主线程上执行将非常感激。
问候。法学。
您可以通过调用QCoreApplication :: processEvents()来使您的示例在没有任何其他线程的情况下工作;在handleEvent()的循环内。这将(很快)产生对事件循环的控制并允许处理事件。在那种情况下:先前发出的信号。
对于中长期运行:对工作者使用QThread(逻辑),ui-thread只处理ui处理(输入和绘制)。