在主窗口添加按鈕,并把按鈕信號關聯槽,在槽函數中創建子窗口對象賦值到普通變量,并調用其 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): child_window = Child() child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結果: 該段代碼運行后,點擊主窗口中的按鈕,子窗口一閃而過。
在主窗口添加按鈕,并把按鈕信號關聯槽,在槽函數中創建子窗口對象并賦值為對象屬性,并調用其 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): self.child_window = Child() self.child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結果: 該段代碼運行后,點擊主窗口中的按鈕,子窗口正常打開,重復點擊按鈕,子窗口重復彈出。
在主窗口__init__方法中創建子窗口對象并賦值為對象屬性,添加按鈕,并把按鈕信號關聯槽,在槽函數中調用子窗口對象的 show 方法。
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) self.child_window = Child() def show_child(self): self.child_window.show() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結果: 重復點擊按鈕,子窗口不重復彈出。
把例1的show()方法改為exec()方法
from PyQt5.QtWidgets import * import sys class Main(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("主窗口") button = QPushButton("彈出子窗", self) button.clicked.connect(self.show_child) def show_child(self): child_window = Child() child_window.exec() class Child(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我是子窗口啊") # 運行主窗口 if __name__ == "__main__": app = QApplication(sys.argv) window = Main() window.show() sys.exit(app.exec_())
運行結果:子窗口順利彈出,且不能重新選擇父窗口
這里涉及到一個概念 模式對話框 與 非模式對話框 (modeless dialog | modal dialog)
模式對話框,就是在彈出窗口的時候,整個程序就被鎖定了,處于等待狀態,直到對話框被關閉。這時往往是需要對話框的返回值進行下面的操作。如:確認窗口(選擇“是”或“否”)。
非模式對話框,在調用彈出窗口之后,調用即刻返回,繼續下面的操作。這里只是一個調用指令的發出,不等待也不做任何處理。如:查找框。
show() ------ modeless dialog
exec() ------- modal dialog
到此這篇關于Python PyQt5中彈出子窗口解決子窗口一閃而過的問題的文章就介紹到這了,更多相關Python PyQt5彈出子窗口內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!