QT开发中文网

qt 在ui的函数里怎么把某个耗时的函数放到线程,数据返回来显示在ui界面(线程传参自定义结构体)qt c++代码实例

可以使用Qt的QThread和信号槽机制来实现将耗时操作放在线程中,并在UI界面上显示结果。

首先定义一个自定义结构体,用于传递参数:

struct ThreadData {
    QString input;
    QString output;
};

然后创建一个继承自QObject的子类,用于执行耗时操作并发出信号:

class Worker : public QObject {
    Q_OBJECT

public:
    explicit Worker(QObject *parent = nullptr) : QObject(parent) {}

public slots:
    void doWork(ThreadData data) {
        // 执行耗时操作
        QString result = calculate(data.input);

        // 发送结果信号
        emit workDone(data.output, result);
    }

signals:
    void workDone(QString output, QString result);

private:
    QString calculate(QString input) {
        // 这里写具体的计算函数
        return "result";
    }
};

在UI界面中,创建一个QThread对象和Worker对象,并将它们连接起来。在需要执行耗时操作的地方,通过调用Worker对象的doWork()方法来启动线程:

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr)
            : QMainWindow(parent), ui(new Ui::MainWindow) {
        ui->setupUi(this);

        // 创建线程和worker对象
        thread = new QThread();
        worker = new Worker();

        // 将worker对象移到新线程中执行
        worker->moveToThread(thread);

        // 连接信号槽
        connect(worker, SIGNAL(workDone(QString,QString)),
                this, SLOT(onWorkDone(QString,QString)));
        connect(this, SIGNAL(startWork(ThreadData)),
                worker, SLOT(doWork(ThreadData)));

        // 启动线程
        thread->start();
    }

    ~MainWindow() {
        delete ui;
        thread->quit();
        thread->wait();
    }

private slots:
    void on_pushButton_clicked() {
        // 点击按钮时启动耗时操作
        ThreadData data = {ui->lineEdit->text(), ""};
        emit startWork(data);
    }

    void onWorkDone(QString output, QString result) {
        // 显示结果
        ui->label->setText(result);
    }

private:
    Ui::MainWindow *ui;
    QThread *thread;
    Worker *worker;
};

在这个例子中,当用户点击按钮时,UI界面会将输入参数传递给Worker对象,并发出startWork信号。Worker对象接收到信号后,在新线程中执行doWork方法,完成计算并发出workDone信号。UI界面接收到workDone信号后,将计算结果显示在Label控件上。

需要注意的是,在程序结束前需要手动停止线程和等待线程退出。可以在MainWindow类的析构函数中调用QThread的quit和wait方法来实现。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2554

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?