整体架構
接續上一篇 Pycharm & QtDesiginer , 將QtDesigner轉換成 python代碼後, 需撰寫如下程式以啟動視窗, 如下所示
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import QCoreApplication
from ui_mainframe import *
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
app.exec()
繼承Ui_MainWindow
Ui_MainWindow類別是由QtDesigner所產生的.
接下來我們須再自行撰寫MainWindow類別以擴增其功能. MainWindow需多重繼承 QMainWindow及Ui_MainWindow二個類別。在MainWindow建構子中,先執行super父類別的建構子, 接下來就是我們要擴充的部份了. 在此我們綁定了按鈕的觸發事件.
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.btnExit.clicked.connect(QCoreApplication.instance().quit)
啟動Window
啟動Window的代碼如下
if __name__ == "__main__":
app = QApplication(sys.argv)
mainwindow = MainWindow()
mainwindow.show()
app.exec()
sys.argv
在 QApplication(sys.argv)這段代碼中, sys.argv是什麼呢?
sys.argv是指在啟動此程式時, 所傳入的參數.
啟動此程式的最原始方法, 是在DOS模式下, 執如下指令
python MainFrame.py
但我們也可以加入其他的參數, 如下
python MainFrame.py first second
此時sys.argv依序如下
sys.argv[0] : 就是這支程式的名稱(如mainframe.py)
sys.argv[1] : 就是 first
sys.argv[2] : 就是second
QApplication
QApplication負責程式的初始、結束及處理事件的迴圈等事項,並提供基本的視窗外觀。這個外觀與系統的桌面環境有關,例如標題列的樣式、視窗外觀、系統功能鍵。不同的作業系統桌面環境下,會有各自不同的外觀。QApplication 物件接受命令列引數作為它的引數,像是如果您沒有設定視窗標題,且會使用執行檔的名稱作為視窗標題名稱,可以使用的引數與其作用
所以在QApplication的參數中, 可以加入sys.argv參數. 如果沒有任何參數, 則可以加入空的list, 如 app=QApplication([])
mainwindow show
這段就是產生我們自行撰寫的視窗物件, 然後顯影在螢幕上
app.exec()
進入QApplication的迴圈之中,開始運行整個視窗的作業。
最大化及全螢幕
mainwindow.showFullScreen() #全螢幕 mainwindow.showMaximized() #最大化
關閉Window
關閉視窗的指令是
app.closeAllWindows()
app.closeAllWindow()會觸發closeEvent事件, 這就如同按下右上角的 X 按鈕, 也會觸發closeEvent事件. 待closeEvent事件處理完畢, 會自動關掉視窗.
def closeEvent(self, event):
pass
所以,結束視窗程式前, 若有需要處理的事情, 可寫於此處。
def closeEvent(self, event):
msg=QMessageBox()
msg.setText("close")
msg.exec()
self.runFlag = False
簡易關閉Window
結束程式之前, 若無任何需要處理的事(比如結束其他新執行緒之類的), 可以設計一個按鈕, 將此按鈕objectname設定為btnExit, 然後綁定clicked事件, 再撰寫如下代碼.
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import QCoreApplication
from ui_mainframe import *
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.btnExit.clicked.connect(QCoreApplication.instance().quit)
事件
todo
