您的位置:首页 > 编程语言 > Qt开发

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

2017-08-29 16:25 495 查看
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的成员函数来操作控件?

       在新定义的线程中调用其他线程的窗口刷新功能,会导致系统提示不安全而报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: