(一)PyQt5基本窗口控件之QMain Window
===============================================================
講解前提——已經(jīng)在Windows或者M(jìn)ac系統(tǒng)上安裝好PyQt5及其相應(yīng)的配置
參考書:《PyQt5 快速開發(fā)與實戰(zhàn)》
===============================================================
(1)基本概念
窗口:指程序的整體界面,可以包含標(biāo)題欄、菜單欄、工具欄、關(guān)閉按鈕、最小化按鈕、最大化按鈕等(可以理解為相當(dāng)于瀏覽器的主頁)
控件:指按鈕、復(fù)選框、文本框、表格、進(jìn)度條等這些組成程序的基本元素 。
窗口控件:是PyQt中建立界面的主要元素。在PyQt中把沒有嵌入到其他控件中的控件稱為窗口,一般窗口都有邊框、標(biāo)題欄。
一個程序可以有多個窗口,一個窗口也可以有多個控件。
在PyQt中,有三個類都是用來創(chuàng)建窗口的,即QMainWindow, QWidget和QDialog,這些窗口可以直接調(diào)用,也可以繼承后再使用。
- 作為PyQt中的基本窗口控件之一,QMain Window主窗口為用戶提供了一個應(yīng)用程序框架,它擁有自己的布局,可以在布局中添加不同的控件。QMain Window窗口可以包含菜單欄、工具欄、狀態(tài)欄、標(biāo)題欄等。是比較常用的窗口形式,一般作為GUI的主窗口使用。
- 與之不同,QDialog是對話框窗口的基類。而對話框主要是用來執(zhí)行短期任務(wù),或者與用戶進(jìn)行互動,既可以是模態(tài)的,也可以是非模態(tài)的。QDialog窗口沒有菜單欄、工具欄、狀態(tài)欄等。
- QWidget類窗口控件是所有用戶界面對象的基類,所有的窗口和控件都直接或者間接繼承自QWidget類。
因此,如果是主窗口,則使用QMain Window類;如果是對話框,則使用QDialog類;如果不確定,或者有可能作為頂層窗口,也有可能嵌入到其他窗口中,則使用QWidget類。
(2)創(chuàng)建窗口
父窗口:指一個窗口包含一個或多個窗口
子窗口:被包含的窗口
頂層窗口:沒有父窗口的窗口,QMain Window就是一個頂層窗口,它可以包含多個界面元素,如菜單欄、工具欄、狀態(tài)欄、子窗口等。
QMain Window繼承自QWidget類,擁有它的所有派生方法和屬性,其中比較重要的方法有:
1)addToolBar(): 表示添加工具欄
2)centralWidget():表示返回窗口中心的一個控件,未設(shè)置時返回NULL
3) menuBar():表示主窗口的菜單欄
4)setCentralWidget():表示設(shè)置窗口中心的控件
5) setStatusBar():表示設(shè)置狀態(tài)欄
6)StatusBar(): 表示獲得狀態(tài)欄對象后,調(diào)用狀態(tài)欄對象的showMessage顯示狀態(tài)欄信息。
需要注意的是:QMain Window不能設(shè)置布局,它有自己的布局方式。
(3)代碼展示
在下面的例子中,我們將創(chuàng)建窗口,顯示在屏幕中央,以及關(guān)閉主窗口寫在一起。
在創(chuàng)建好的窗口中,插入了一個Button控件,用來關(guān)閉當(dāng)前窗口
# _*_ coding: UTF-8 _*_
# Author: liming
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget, QHBoxLayout, QPushButton, QWidget
from PyQt5.QtGui import QIcon
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.resize(600, 300) # 設(shè)置窗口的大小
self.status = self.statusBar() # 狀態(tài)欄
self.status.showMessage('正在處理中......', 0) # 顯示狀態(tài)欄信息,默認(rèn)為0(表示下一個操作前,一直顯示狀態(tài)欄;也可以設(shè)置顯示時間,單位為毫秒)
self.setWindowTitle('PyQt MainWindow操作例子') # 設(shè)置該窗口的名稱
self.center() # 將窗口放在屏幕中央
self.button1 = QPushButton('關(guān)閉當(dāng)前窗口!') # 創(chuàng)建一個按鈕,并賦予相應(yīng)的文本
self.button1.clicked.connect(self.onButtonClick) # 關(guān)聯(lián)按鈕的點擊信號與onButtonClickx信號槽
layout = QHBoxLayout() # 設(shè)置水平布局
layout.addWidget(self.button1) # 水平布局應(yīng)用到button1
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame) # 設(shè)置窗口中心的控件
def center(self):
screen = QDesktopWidget().screenGeometry() # 計算顯示屏幕的大小
size = self.geometry() # 用來獲取窗口的大小
self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) # 將窗口移動到屏幕中央
def onButtonClick(self):
sender = self.sender() # 發(fā)送信號的對象
print(sender.text() + '被按下了')
qApp = QApplication.instance()
qApp.quit()
if __name__ == '__main__':
app = QApplication(sys.argv) # 是PyQt的整個后臺管理的命脈
app.setWindowIcon(QIcon('./images/cartoon1.ico')) # 設(shè)置窗口的頭標(biāo)
form = MainWindow() # 調(diào)用MainWindow類,并進(jìn)行顯示
form.show()
sys.exit(app.exec_()) # 運行主循環(huán),必須調(diào)用此函數(shù)才可以開始事件處理
結(jié)果

本部分完畢!
浙公網(wǎng)安備 33010602011771號