写一个pyqt5的例子:生成函数a随机生成1到100整数,当生成小于50整数时将此后生成整数放入队列并通知函数b从队列将数据取出,当生成两次大于等于50的整数后停止将随后生成的整数放入队列。生成函数b在函数a通知从队列中取数时从队列取出数据并删除队列中取出数据,在函数a通知停止取数后停止取数并根据取出的数据画折线图。最后将折线图展示在Qlabel中
时间: 2024-03-27 16:39:52 浏览: 98
好的,以下是一个简单的实现:
```python
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtChart import *
class RandomGenerator(QObject):
dataReady = pyqtSignal(int)
stopSignal = pyqtSignal()
def __init__(self):
super().__init__()
self.queue = []
self.count = 0
def start(self):
while True:
val = random.randint(1, 100)
if val < 50:
self.queue.append(val)
if len(self.queue) == 1:
self.dataReady.emit(val)
else:
self.count += 1
if self.count >= 2:
self.stopSignal.emit()
break
class ChartDrawer(QObject):
finished = pyqtSignal()
def __init__(self, queue):
super().__init__()
self.queue = queue
self.series = QLineSeries()
def start(self):
while True:
if len(self.queue) > 0:
val = self.queue.pop(0)
self.series.append(self.series.count(), val)
else:
break
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.generator = RandomGenerator()
self.drawer = ChartDrawer(self.generator.queue)
self.chartView = QChartView()
self.chart = QChart()
self.chart.addSeries(self.drawer.series)
self.chart.createDefaultAxes()
self.chartView.setChart(self.chart)
self.startButton = QPushButton("Start")
self.startButton.clicked.connect(self.start)
self.stopButton = QPushButton("Stop")
self.stopButton.clicked.connect(self.stop)
self.stopButton.setEnabled(False)
self.statusBar().showMessage("Ready")
layout = QVBoxLayout()
layout.addWidget(self.chartView)
layout.addWidget(self.startButton)
layout.addWidget(self.stopButton)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def start(self):
self.statusBar().showMessage("Running")
self.generatorThread = QThread()
self.generator.moveToThread(self.generatorThread)
self.generatorThread.started.connect(self.generator.start)
self.generator.dataReady.connect(self.handleDataReady)
self.generator.stopSignal.connect(self.handleStopSignal)
self.generatorThread.start()
self.drawerThread = QThread()
self.drawer.moveToThread(self.drawerThread)
self.drawer.finished.connect(self.handleDrawerFinished)
self.drawerThread.start()
self.startButton.setEnabled(False)
self.stopButton.setEnabled(True)
def stop(self):
self.statusBar().showMessage("Stopping")
self.generator.stopSignal.emit()
self.generatorThread.quit()
self.drawerThread.quit()
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
def handleDataReady(self, val):
self.drawer.series.append(self.drawer.series.count(), val)
def handleStopSignal(self):
self.generatorThread.quit()
def handleDrawerFinished(self):
self.chartView.update()
self.statusBar().showMessage("Finished")
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个例子中,我们创建了两个类:`RandomGenerator` 生成随机数并将其添加到队列中,如果随机数小于50,则发出 `dataReady` 信号以通知 `ChartDrawer` 取出数据并将其添加到折线图中;如果随机数大于等于50,则计数器加一,如果计数器达到2,则发出 `stopSignal` 信号以停止生成随机数。
`ChartDrawer` 从队列中取出数据并将其添加到折线图中,直到队列为空。当 `RandomGenerator` 发出 `stopSignal` 信号时,`ChartDrawer` 停止取出数据并发出 `finished` 信号。
`MainWindow` 是我们的主窗口,包含一个折线图、一个“开始”按钮和一个“停止”按钮。当用户点击“开始”按钮时,我们启动两个线程:一个用于运行 `RandomGenerator`,另一个用于运行 `ChartDrawer`。当用户点击“停止”按钮时,我们停止生成随机数并等待两个线程退出。在 `RandomGenerator` 发出 `stopSignal` 信号后,我们退出 `generatorThread`,此时 `ChartDrawer` 将继续取出队列中的数据直到为空,并发出 `finished` 信号。
最后,我们将折线图添加到 `QChart` 中,并将其显示在 `QChartView` 中。在 `handleDataReady` 和 `handleDrawerFinished` 方法中,我们更新折线图。在 `handleStopSignal` 方法中,我们退出 `generatorThread`。
阅读全文