1. 수요
이벤트의 진행 노드에 따라 실현
- 자동 팝업 창, 노드 내용을 반영하는 창
- 자동으로 팝업 제거
QThread를 사용하여 멀티스레딩을 수행하는 것은 번거롭고 QMessage 메시지 상자를 수동으로 클릭해야 하므로 위의 요구 사항을 쉽게 실현할 수 없습니다. 여기서는 QTimer+서브윈도우 방식으로 구현한다.
여기서는 주로 "In PYQT5, click the button in the main window to pop up the sub-window" 블로그와 "Use of QTimer in PyQt5" 블로그 를 참조하십시오 .
2. 예시
여기서는 인터페이스를 만들어야 한다고 가정하는데, 인터페이스는 카운팅 기능을 구현하고 있으며, 10초마다 팝업창이 뜨고 현재 카운트를 알려주는 창이 뜬다.
효과는 다음과 같습니다.
3. 코드 구현
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class Main(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setFixedSize(650, 400) # 窗口大小
self.setWindowTitle("主窗口")
# 开始计数按钮
start_button = QPushButton("开始计数", self)
# 关联到计数函数
start_button.clicked.connect(self.start_calculation)
# 终止计数按钮
stop_button = QPushButton("终止计数", self)
stop_button.clicked.connect(self.stop_calculation)
# 布局
layout = QGridLayout()
layout.addWidget(start_button, 1, 1)
layout.addWidget(stop_button, 1, 2)
self.setLayout(layout)
# 子窗口对象是否存在
self.childWindowExist = False # 默认为不存在
# 开始计数
def start_calculation(self):
print("开始计数")
self.num = 0 # 初始计数
self.timer = QTimer()
self.timer.start(1000) # 间隔1秒钟执行一次操作
self.timer.timeout.connect(self.calculation)
# 终止计数
def stop_calculation(self):
print("停止计数")
self.num = 0
self.timer.stop()
if self.childWindowExist:
self.child_window.close()
self.childWindowExist = False
# 计数函数
def calculation(self):
# 每次加1
self.num += 1
print("当前计数为{}".format(self.num))
if self.num % 10 == 0:
self.childWindowExist = True
# 如果能够整除10,则弹窗
self.child_window = Child()
self.child_window.window_show("当前计数为{}".format(self.num))
self.child_window.show()
else:
if self.childWindowExist:
self.child_window.close()
class Child(QWidget):
def __init__(self):
super().__init__()
self.setFixedSize(300, 300)
self.setWindowTitle("子窗口")
def window_show(self, text):
# 展示内容
self.label = QLabel(text)
# 子窗口中的布局
layout = QGridLayout()
layout.addWidget(self.label, 0, 0)
self.setLayout(layout)
#运行主窗口
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec_())