GUI(主)线程与子线程之间的通信(用信号槽通讯)

时间:2022-06-20 07:09:10

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

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

程序截图:

GUI(主)线程与子线程之间的通信(用信号槽通讯)

上代码:

  1. #include <QtGui>
  2. #include <QtCore>
  3. #include <windows.h>
  4. class Thread : public QThread
  5. {
  6. Q_OBJECT
  7. private:
  8. int number;
  9. protected:
  10. void run();
  11. public:
  12. Thread(QObject *parent=0);
  13. ~Thread();
  14. signals:
  15. void UpdateSignal(int num);
  16. public slots:
  17. void ResetSlot();
  18. };
  19. class Widget : public QWidget
  20. {
  21. Q_OBJECT
  22. private:
  23. QLabel *label;
  24. QPushButton *startButton;
  25. QPushButton *stopButton;
  26. QPushButton *resetButton;
  27. Thread *myThread;
  28. int number;
  29. public:
  30. Widget(QWidget *parent = 0);
  31. ~Widget();
  32. signals:
  33. void ResetSignal();
  34. public slots:
  35. void ClearSlot();
  36. void StartSlot();
  37. void StopSlot();
  38. void UpdateSlot(int num);
  39. };
  40. Thread::Thread(QObject *parent)
  41. {
  42. number = 0;
  43. }
  44. Thread::~Thread()
  45. {
  46. }
  47. void Thread::run()
  48. {
  49. while(1)
  50. {
  51. //开启一个死循环,让number每秒自增1,并通过发送UpdateSignal信号通知主界面更新
  52. emit UpdateSignal(number);
  53. number++;
  54. sleep(1);
  55. }
  56. }
  57. void Thread::ResetSlot()
  58. {
  59. number = 0;
  60. emit UpdateSignal(number);
  61. }
  62. Widget::Widget(QWidget *parent)
  63. {
  64. //设置界面布局
  65. startButton = new QPushButton("start");
  66. stopButton = new QPushButton("stop");
  67. resetButton = new QPushButton("reset");
  68. label = new QLabel("empty");
  69. myThread = new Thread;
  70. QVBoxLayout *layout = new QVBoxLayout;
  71. layout->addWidget(label);
  72. layout->addWidget(startButton);
  73. layout->addWidget(stopButton);
  74. layout->addWidget(resetButton);
  75. setLayout(layout);
  76. //连接各自信号糟
  77. connect(stopButton, SIGNAL(clicked()),
  78. this, SLOT(StopSlot()));
  79. connect(startButton, SIGNAL(clicked()),
  80. this, SLOT(StartSlot()));
  81. connect(resetButton, SIGNAL(clicked()),
  82. this, SLOT(ClearSlot()));
  83. connect(myThread, SIGNAL(UpdateSignal(int)),
  84. this, SLOT(UpdateSlot(int)));
  85. connect(this, SIGNAL(ResetSignal()),
  86. myThread, SLOT(ResetSlot()));
  87. setWindowTitle("Thread Test");
  88. resize(200, 200);
  89. myThread->start();
  90. }
  91. Widget::~Widget()
  92. {
  93. }
  94. void Widget::StartSlot()
  95. {
  96. myThread->start();
  97. }
  98. void Widget::StopSlot()
  99. {
  100. myThread->terminate();
  101. }
  102. void Widget::UpdateSlot(int num)
  103. {
  104. label->setText(QString::number(num));
  105. }
  106. void Widget::ClearSlot()
  107. {
  108. emit ResetSignal();
  109. }
  110. #include "main.moc"
  111. int main(int argc, char **argv)
  112. {
  113. QApplication app(argc, argv);
  114. Widget *widget = new Widget;
  115. widget->show();
  116. return app.exec();
  117. }

http://blog.csdn.net/small_qch/article/details/6681907