GUI(主)线程与子线程之间的通信

来源:互联网 发布:淘宝付款时间限制 编辑:程序博客网 时间:2024/04/30 20:30

在主线程上,可以控制子线程启动,停止,清零

如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字。


程序截图:



上代码:

#include <QtGui>  #include <QtCore> #include <windows.h>class Thread : public QThread  {  Q_OBJECT  private:  int number;  protected:  void run();  public:  Thread(QObject *parent=0);  ~Thread();  signals:  void UpdateSignal(int num);  public slots:  void ResetSlot();  };  class Widget : public QWidget  {  Q_OBJECT  private:  QLabel *label;  QPushButton *startButton;  QPushButton *stopButton;  QPushButton *resetButton;  Thread *myThread;  int number;  public:  Widget(QWidget *parent = 0);  ~Widget();  signals:  void ResetSignal();  public slots:  void ClearSlot();  void StartSlot();  void StopSlot();  void UpdateSlot(int num);  };  Thread::Thread(QObject *parent)  {  number = 0;  }  Thread::~Thread()  {  }  void Thread::run()  {  while(1)  {  //开启一个死循环,让number每秒自增1,并通过发送UpdateSignal信号通知主界面更新emit UpdateSignal(number);  number++;  sleep(1);  }  }  void Thread::ResetSlot()  {  number = 0;  emit UpdateSignal(number);  }  Widget::Widget(QWidget *parent)  {  //设置界面布局startButton = new QPushButton("start");  stopButton = new QPushButton("stop");  resetButton = new QPushButton("reset");  label = new QLabel("empty");  myThread = new Thread;  QVBoxLayout *layout = new QVBoxLayout;  layout->addWidget(label);  layout->addWidget(startButton);  layout->addWidget(stopButton);  layout->addWidget(resetButton);  setLayout(layout);  //连接各自信号糟connect(stopButton, SIGNAL(clicked()),   this, SLOT(StopSlot()));  connect(startButton, SIGNAL(clicked()),  this, SLOT(StartSlot()));  connect(resetButton, SIGNAL(clicked()),  this, SLOT(ClearSlot()));  connect(myThread, SIGNAL(UpdateSignal(int)),   this, SLOT(UpdateSlot(int)));  connect(this, SIGNAL(ResetSignal()),  myThread, SLOT(ResetSlot()));  setWindowTitle("Thread Test");  resize(200, 200);  myThread->start();  }  Widget::~Widget()  {  }  void Widget::StartSlot()  {  myThread->start();  }  void Widget::StopSlot()  {  myThread->terminate();  }  void Widget::UpdateSlot(int num)  {  label->setText(QString::number(num));  }  void Widget::ClearSlot()  {  emit ResetSignal();  }  #include "main.moc"int main(int argc, char **argv)  {  QApplication app(argc, argv);  Widget *widget = new Widget;  widget->show();  return app.exec();  } 



原创粉丝点击