以下內容翻譯自https://build-system.fman.io/pyqt5-tutorial,有刪減。
我們先看下面一個簡單的GUI代碼:
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication([])
label = QLabel('Hello World!')
label.show()
app.exec_()
第一行是導入相關的QT相關的庫。
接著第二行是通過創建了一個QApplication
:
app = QApplication([])
這是必須要創建的一個對象。每個GUI程序都必須有且只有一個QApplication的實例。如果沒有這個實例的話,我們寫的QT是沒法執行的,所以我們寫QT代碼的時候一定不要忘了創建這個對象。 創建這個對象時需要傳遞一個list參數,因為我們的GUI不需要什么參數,所以直接傳遞了一個[]
。
在創建了app之后,我們又創建了一個Label(標簽):
label = QLabel('Hello World!')
傳遞的參數就是標簽顯示的內容,然后通過調用show()
方法讓它在屏幕上顯示。
最后的一行代碼是告訴qt一直運行下去,直到有人關閉它。
完成上述工作之后,執行代碼,我們的一個小小窗口就會顯示在屏幕上:
Widgets
我們在Qt程序中看到的每個東西都可以稱之為一個widget:按鈕,標簽,窗口,對話框,程序的進度條等等。與HTML元素類似,widget一般也都是嵌入式的。舉個例子,一個窗口包含了一個按鈕,同時也可能包含了一個標簽。
下面的截圖展示了QT中常用的widget。
從上到下,從左到右,這些widget依次是:
Layouts
正如上面的截圖所示,我們的GUI中可能包含了多個widgets。在這種情況下,我們需要告訴QT如何安放這些widgets。例如。我們可以使用QVBoxLayout
垂直堆放widget:
這個截圖的代碼如下:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()
一如既往,我們還是先創建了一個QApplication
。接著我們創建了一個window
。我們使用的是最基本的QWdiget
,因為它只是一個容器,用來放置widget,我們并不需要它有什么特殊的功能。然后,我們就創建了一個layout
,還創建了兩個QPushButton
放在里面。最后,我們告訴了window,我們需要使用這個layout。然后就跟我們的第一個GUI一樣,調用show()
和exec_()
。
當然還有很多其他的layout,例如QHBoxLayOut等等。更多的風格,可以在qt的網站上查閱
自定義風格
QT一個比較強大的地方就是它支持自定義的用戶風格。
風格設置
比較直接的設置方式就是在我們的程序中直接指定全局的風格。我們再看看之前的截圖:
上面的這個窗口風格稱之為Flusion
,我們也可以把他替換成Windows
風格:
通過qpp.setStyle(...)
方法,我們就可以設置自己的風格了。
from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...
具體支持什么樣的風格依賴于我們使用的操作系統,但是一般都支持以下的風格:'Fusion'
, 'Windows'
, 'WindowsVista'
(僅Windows支持) and 'Macintosh'
(僅Mac支持)
自定義顏色
如果我們喜歡一種風格,但是我們想改變一些顏色。那么我們就可以使用QPalette來實現我們的功能。例如:
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
button.show()
app.exec_()
執行效果如下:
面板風格
除了上述的功能之外,我們還可以通過面板風格來改變我們程序的外觀。這就是QT類似于CSS的特性。我們可以通過以下的方法我們的面板添加一些空間:
from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()
更多關于面板風格的信息,可以查看qt官網。
Signals / slots
QT 通過Signals
(信號)機制來讓我們對一些事件做響應,例如我們點擊了一個按鈕。下面的這個例子就是當我們點擊按鈕時,會彈出對話框。
from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Click')
def on_button_clicked():
alert = QMessageBox()
alert.setText('You clicked the button!')
alert.exec_()
button.clicked.connect(on_button_clicked)
button.show()
app.exec_()
button.clicked
這就是個signal(信號),.connect(...)
就是我們指定的與這個signal關聯的slot(槽)
。上面這是一個簡單的響應函數,當我們點擊這個按鈕的時候,這個動作(函數)就會觸發。
Signals在QT中是無處不在的,用戶也可以定義自己的signal。
編譯屬于自己的APP
現在我們已經有了一點關于GUI的基本知識了。但是當我們寫好一個程序之后,如何給別人使用呢?讓別人搭建環境,然后再把腳本給人家嗎?這肯定是不合理的,所以我們該怎么做呢?
在python的世界中,將源碼轉換成一個可執行的包
,這種操作稱之為freezing
。盡管現在已經有很多的庫都可以解決這個問題,例如:PyInstaller ,py2exe,cx_Freeze,bbfreze,py2app...但是這些傳統的庫用來freezing一個PyQt程序還是有點難度的。
這里我們使用一個全新的fbs
庫,它可以讓我們輕易的將python源碼轉換成一個執行的PyQt程序。安裝fbs
也很簡單,執行下面的命令就OK了:
pip install fbs
接著執行:
fbs startproject
然后你就會看到下面的提示:
當你輸入run
之后,就會打開一個空的窗口:
這就跟我們之前創建的一個qt程序相似。它會在我們的當前目錄下創建一個文件src/main/python/main.py
,然后我們可以試著把它編程一個可執行的文件。
fbs freeze
這個命令就在你當前的目錄的target/MyApp/
子目錄有了一個可執行的文件。然后我們就可以把它發送給別人了。
(注意:fbs現在支持Python 3.5 或者 3.6,如果你的版本不是二者之一,同時你的fbs還出現了問題,建議你安裝Python 3.6再試試。)
小獎勵![img]:創建一個安裝包
通過fbs installer
命令我們還可以創建安裝包。
(如果你使用的Windows系統,那么你需要先安裝NSIS,然后配置好環境變量)
線面的一篇文章說明了如何使用fbs
,另外你也可以看看fbs教程