如何通过QThread自定义子线程来控制QT窗口控件
2017-08-29 16:25
495 查看
1.添加一个自定义类,继承QThread类,在类中添加MainWindow类型的指针MainWindow *w
定义信号和槽函数,线程运行时发出信号,槽函数中调用MainWindow类内的控件操作函数。
myThread.h:
myThread.cpp:
2.在MainWindow类中定义用于操作窗口内控件的函数,此处以操作ProgressBar为例
MainWindow.h:
MainWindow.cpp
**为什么要通过槽函数来操作窗口控件,而不是直接调用MainWindow的成员函数来操作控件?
在新定义的线程中调用其他线程的窗口刷新功能,会导致系统提示不安全而报错。
定义信号和槽函数,线程运行时发出信号,槽函数中调用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的成员函数来操作控件?
在新定义的线程中调用其他线程的窗口刷新功能,会导致系统提示不安全而报错。
相关文章推荐
- 浅谈 Qt 布局管理器 如何让控件随着窗口变化
- QT中如何使控件随窗口改变大小?
- Qt中如何通过QStyle自定义能够跨平台的界面控件
- 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
- Flex中如何通过设置editable属性控制NumericStepper控件可编辑/不可编辑状态的例子
- 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
- 如何控制其他程序窗体上的窗口控件
- 如何通过一个毫不相关的进程去控制另一进程窗口中数据
- 如何控制其他程序窗体上的窗口控件(中)
- QT中如何使ui中的控件随窗口改变大小?
- Qt中如何让控件自适应窗口大小
- 浅谈 Qt 布局管理器 如何让控件随着窗口变化
- 如何控制其他程序窗体上的窗口控件(上)
- 如何控制其他程序窗体上的窗口控件(下)
- 如何通过想窗口控件发消息模拟点击按键
- 如何控制其他程序窗体上的窗口控件
- 如何控制其他程序窗体上的窗口控件:上
- VFP如何控制一个窗口的所有控件的大小随窗口的变化而变化
- QT中控件如何随着窗口大小的改变而使它充满整个窗口空间
- 如何控制其他程序窗体上的窗口控件:中