如何通过QThread自定义子线程来控制QT窗口控件

来源:互联网 发布:阿里云客服热线 编辑:程序博客网 时间:2024/05/16 23:51

1.添加一个自定义类,继承QThread类,在类中添加MainWindow类型的指针MainWindow *w

定义信号和槽函数,线程运行时发出信号,槽函数中调用MainWindow类内的控件操作函数。

myThread.h:

class myThread : public QThread{public:    myThread(MainWindow *win);private:    MainWindow *w;signals:    void bar_sig();public slots:    void bar_slot();protected:    void run();}

myThread.cpp:

myThread::myThread(MainWindow *win){    this->w = win;    //连接信号和槽函数    connect(this,SIGNAL(bar_sig()),this,SLOT(bar_slot()));}void myThread::run(){    while(1){        //发出信号,此时调用槽函数        emit bar_sig();        msleep(100);       }}void myThread::bar_slot(){    //在槽函数中调用MainWindow类的控件操作函数    w->bar_incr();}

2.在MainWindow类中定义用于操作窗口内控件的函数,此处以操作ProgressBar为例

MainWindow.h:

class MainWindow : public QMainWindow{public:    MainWindow();   //调用此函数,进度条显示值+1    void bar_incr();}

MainWindow.cpp

//全局线程myThread *th;MainWindow::MainWindow(){     ui->setup(this);   //以此MainWindow实例来构造一个新的线程    th = new myThread(this);    th->start();}void Mainwindow::bar_incr(){    ui->ProgressBar->setValue(ui->ProgressBar->value()+1);}

**为什么要通过槽函数来操作窗口控件,而不是直接调用MainWindow的成员函数来操作控件?

       在新定义的线程中调用其他线程的窗口刷新功能,会导致系统提示不安全而报错。