梦想的彼岸花开 2024-05-24 14:53 采纳率: 77.8%
浏览 25
已结题

QT 线程如何执行界面类的成员函数

我有一个QT的界面类,点击一个按钮后会有大量的数据处理(for循环),我想把这个数据处理放到线程中,然后界面这块就显示一个界面用来展示给用户当前处理了多少个,共有多少个等信息,相当于一个进度条。这段数据处理是要访问这个类的一些成员变量的,我的想法是将这个数据处理写成这个类的成员函数,所有的数据处理都在这个函数内执行,在用户点击特定按钮后,程序响应然后创建一个线程,这个线程执行这个特定函数,然后执行完成后线程退出。这个该怎么实现?


class A{
  // ....
  // 数据处理函数
  void DataProcess();
public slots:
  void onBtnClicked();
}

void A::DataProcess()
{
  // for循环数据处理
}

void A::onBtnClicked()
{
  // 创建线程,使用该线程执行DataProcess
  // 创建一个窗口展示处理进度
  // 执行结束后线程销毁
}

请问这个 onBtnClicked 函数里创建临时线程并让该线程执行 DataProcess 函数怎么实现?

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-05-24 14:53
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    在Qt中使用线程可以使用QThread类,具体实现步骤如下:

    1.创建一个继承自QThread的线程类,例如MyThread。

    2.在MyThread中添加A类对象的成员变量,并重写run函数,在run函数中通过成员变量调用A的DataProcess函数。

    3.在A的onBtnClicked函数中创建MyThread类型的对象,设置其A类对象的成员变量,然后启动线程。

    4.在A的onBtnClicked函数中创建一个进度条窗口,然后在MyThread的run函数中通过信号槽机制将进度信息传递给进度条窗口进行展示(具体实现可以通过定义一个QProgressBar类的指针成员变量,并在run函数中通过setValue函数更新进度条值)。

    5.数据处理结束后,MyThread会自动退出,可以在MyThread的析构函数中销毁进度条窗口。

    修改后的代码如下:

    class MyThread : public QThread
    {
    public:
        void run()
        {
            //调用A的对象成员函数
            m_a->DataProcess();
    
            //数据处理结束,发送finished信号
            emit finished();
        }
    
        void setAObject(A *a)
        {
            m_a = a;
        }
    
    signals:
        void finished();
    private:
        A *m_a;
    };
    
    class A : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit A(QWidget *parent = nullptr);
        ~A();
    
    public slots:
        void onBtnClicked();
    
    private:
        Ui::A *ui;
    };
    
    void A::onBtnClicked()
    {
        //创建线程
        MyThread *thread = new MyThread();
        thread->setAObject(this);
        thread->start();
    
        //创建进度条窗口
        QProgressDialog *progressDialog = new QProgressDialog(this);
        progressDialog->setLabelText("Data Processing...");
        progressDialog->setWindowModality(Qt::WindowModal);
        progressDialog->setMinimum(0);
        progressDialog->setMaximum(100);
    
        //将线程的progress信号连接到进度条窗口的setValue槽
        connect(thread, &MyThread::progress, progressDialog, &QProgressDialog::setValue);
    
        //将线程的finished信号连接到进度条窗口的close槽
        connect(thread, &MyThread::finished, progressDialog, &QProgressDialog::close);
    
        //显示进度条窗口
        progressDialog->exec();
    
        delete progressDialog;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 创建了问题 5月24日