pyqt5入門實例

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import sys
#這裏我們進行了一些必要模塊的導入。最基礎的widget組件位於PyQt5.QtWidget模塊中
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QAction, qApp, 
QPushButton, QMessageBox, QDesktopWidget, QMainWindow, QTextEdit, QGridLayout)
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication # 引入QtCore的對象模塊


# 新窗口
class SecondWindow(QWidget):
    def __init__(self):
        super(SecondWindow, self).__init__()
        self.resize(200, 200)
        self.setStyleSheet("background: black") # 背景色改爲黑色


#類
class Example(QMainWindow): #QWidget,QMainWindow


    def __init__(self):
        '''
    在面向對象編程中有三個重要的東西,分別是類,數據和方法。
    這裏我們創建了一個新類叫做Example。Example類繼承自QWidget類。
    這意味着我們調用了兩個構造方法:第一個是Example類的構造方法,第二個是被繼承類的構造方法。
    super()方法返回了Example類的父類對象,並且我們調用了父類的構造方法。
    __init__()方法是Python語言中的構造方法。
    '''
        super().__init__()
        #Qwidget組件是PyQt5中所有用戶界面類的基礎類。
        #我們給QWidget提供了默認的構造方法。默認構造方法沒有父類。
        #沒有父類的widget組件將被作爲窗口使用。
        #w = QWidget()
        self.setFont(QFont('SansSerif', 10)) # 設置提示框字體:10px大小的SansSerif字體
        self.setToolTip('This is a <b>QWidget</b> widget啊') # 創建窗體提示框


        self.resize(600, 600) # 調整了widget組件的大小。它現在是250px寬,150px高
        #self.move(300, 300) # 這個位置是屏幕上x=300,y=300的座標
        #self.setGeometry(300, 300, 300, 220) #(X軸,Y軸,窗口寬度,窗口高度);將resize()和move()方法融合在一個方法內
        self.setWindowTitle('Main window') # 對話框標題
        self.setWindowIcon(QIcon('48X48(1).ico')) # 圖標


        self.initUI()


        self.center() # 調用窗口居中方法
        self.show() # show()方法在屏幕上顯示出widget


    def initUI(self):


        # 定義狀態欄,在窗口最後一行
        self.statusBar().showMessage('Ready') # 顯示狀態欄默認文字Ready 


        # exitAction定義按鈕及按鈕事件
        exitAction = QAction(QIcon('48X48.ico'), '&Exit', self)  # 設置菜單按鈕圖標及文字      
        exitAction.setShortcut('Ctrl+Q') # 設置快捷鍵
        exitAction.setStatusTip('Exit application') # 鼠標浮於菜單項之上就會顯示的一個狀態提示
        exitAction.triggered.connect(qApp.quit) # 當我們選中特定的動作,一個觸發信號會被髮射。信號連接到QApplication組件的quit()方法。這樣就中斷了應用。


        # 定義菜單欄
        menubar = self.menuBar() # menuBar()方法創建了一個菜單欄。
        fileMenu = menubar.addMenu('&File') # 我們創建一個file菜單
        fileMenu.addAction(exitAction)  # 將退出動作添加到file菜單中。


        # 新建工具欄,並綁定事件
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAction)


        qbtn = QPushButton('退出', self) # 定義退出按鈕
        '''
        在PyQt5中,事件處理系統由信號&槽機制建立。如果我們點擊了按鈕,信號clicked被髮送。
        槽可以是Qt內置的槽或Python 的一個方法調用。
        QCoreApplication類包含了主事件循環;它處理和轉發所有事件。instance()方法給我們返回一個實例化對象。
        注意QCoreAppli類由QApplication創建。點擊信號連接到quit()方法,將結束應用。
        事件通信在兩個對象之間進行:發送者和接受者。發送者是按鈕,接受者是應用對象。
        '''
        qbtn.clicked.connect(QCoreApplication.instance().quit) # 按鈕點擊事件
        qbtn.setToolTip('點擊按鈕後 <b>本窗口關閉</b>') # 創建按鈕提示框
        qbtn.resize(qbtn.sizeHint())
        #qbtn.move(100, 100) # 按鈕絕對定位


        nbtn = QPushButton('彈出新窗口', self)
        nbtn.setToolTip('彈出新窗口') # 創建按鈕提示框
        nbtn.clicked.connect(self.onclick)
        nbtn.resize(nbtn.sizeHint())


        # 定義文本框組件。
        textEdit = QTextEdit()
        #self.setCentralWidget(textEdit) #我們將它設置成QMainWindow的中心組件。中心組件佔據了所有剩下的空間。


        grid = QGridLayout()
        grid.setSpacing(10) # 網格間的距離爲10


        #grid.addWidget(fileMenu, 1, 0)
        #grid.addWidget(toolbar, 2, 1)
        grid.addWidget(qbtn, 1, 0)
        grid.addWidget(nbtn, 1, 1)
        grid.addWidget(textEdit, 2, 0, 1,2)


        widget= QWidget() #加一個wiget佈局設爲中心,就能在QMainWindow 窗口實現佈局了
        widget.setLayout(grid)
        self.setCentralWidget(widget)


    # 按鈕事件
    def onclick(self):
        self.newWindow = SecondWindow()
        self.newWindow.show()
        #newWindow.exec_()


    # 設置窗口居中
    def center(self):
        qr = self.frameGeometry() # 獲得主窗口的一個矩形特定幾何圖形。這包含了窗口的框架。
        # QtGui.QDesktopWidget類提供了我們桌面窗口的信息,包含了屏幕尺寸。
        cp = QDesktopWidget().availableGeometry().center() #算出相對於顯示器的絕對值。並且從這個絕對值中,我們獲得了屏幕中心點。
        qr.moveCenter(cp) #矩形已經設置好了它的寬和高。現在我們把矩形的中心設置到屏幕的中間去。矩形的大小並不會改變。
        self.move(qr.topLeft()) # 移動了應用窗口的左上方的點到qr矩形的左上方的點,因此居中顯示在我們的屏幕上。


    # 窗口關閉事件,如果我們關閉一個QWidget,QCloseEvent類事件將被生成。
    # 要修改組件動作我們需要重新實現closeEvent()事件處理方法。
    def closeEvent(self, event):
        #代碼中第一個字符串的內容被顯示在標題欄上。第二個字符串是對話框上顯示的文本。
        #第三個參數指定了顯示在對話框上的按鈕集合。最後一個參數是默認選中的按鈕。
        #這個按鈕一開始就獲得焦點。返回值被儲存在reply變量中。(標題,文本,按鈕集合,默認選擇按鈕)
        reply = QMessageBox.question(self, 'Message標題',"Are you sure to quit?你確定要退出嗎?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


if __name__ == '__main__':
    '''
所有的PyQt5應用必須創建一個應用(Application)對象。
sys.argv參數是一個來自命令行的參數列表。Python腳本可以在shell中運行。
這是我們用來控制我們應用啓動的一種方法。
'''
    app = QApplication(sys.argv)
    ex = Example() # 應用和example對象被創建。主循環被啓動。
    '''
最後,應用進入主循環。在這個地方,事件處理開始執行。
主循環用於接收來自窗口觸發的事件,並且轉發他們到widget應用上處理。
如果我們調用exit()方法或主widget組件被銷燬,主循環將退出。
sys.exit()方法確保一個不留垃圾的退出。系統環境將會被通知應用是怎樣被結束的。
exec_()方法有一個下劃線。因爲exec是Python保留關鍵字。因此,用exec_()來代替。
'''
    sys.exit(app.exec_())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章