Python QT5 簡(jiǎn)潔入門(mén)

以下內(nèi)容翻譯自https://build-system.fman.io/pyqt5-tutorial,有刪減。

我們先看下面一個(gè)簡(jiǎn)單的GUI代碼:

from PyQt5.QtWidgets import QApplication, QLabel

app = QApplication([])
label = QLabel('Hello World!')
label.show()
app.exec_()

第一行是導(dǎo)入相關(guān)的QT相關(guān)的庫(kù)。

接著第二行是通過(guò)創(chuàng)建了一個(gè)QApplication:

app = QApplication([])

這是必須要?jiǎng)?chuàng)建的一個(gè)對(duì)象。每個(gè)GUI程序都必須有且只有一個(gè)QApplication的實(shí)例。如果沒(méi)有這個(gè)實(shí)例的話,我們寫(xiě)的QT是沒(méi)法執(zhí)行的,所以我們寫(xiě)QT代碼的時(shí)候一定不要忘了創(chuàng)建這個(gè)對(duì)象。 創(chuàng)建這個(gè)對(duì)象時(shí)需要傳遞一個(gè)list參數(shù),因?yàn)槲覀兊腉UI不需要什么參數(shù),所以直接傳遞了一個(gè)[]。

在創(chuàng)建了app之后,我們又創(chuàng)建了一個(gè)Label(標(biāo)簽):

label = QLabel('Hello World!')

傳遞的參數(shù)就是標(biāo)簽顯示的內(nèi)容,然后通過(guò)調(diào)用show()方法讓它在屏幕上顯示。

最后的一行代碼是告訴qt一直運(yùn)行下去,直到有人關(guān)閉它。

完成上述工作之后,執(zhí)行代碼,我們的一個(gè)小小窗口就會(huì)顯示在屏幕上:

QVBoxLayout example

Widgets

我們?cè)赒t程序中看到的每個(gè)東西都可以稱(chēng)之為一個(gè)widget:按鈕,標(biāo)簽,窗口,對(duì)話框,程序的進(jìn)度條等等。與HTML元素類(lèi)似,widget一般也都是嵌入式的。舉個(gè)例子,一個(gè)窗口包含了一個(gè)按鈕,同時(shí)也可能包含了一個(gè)標(biāo)簽。

下面的截圖展示了QT中常用的widget。

Screenshot of common Qt widgets using the Fusion style

從上到下,從左到右,這些widget依次是:

Layouts

正如上面的截圖所示,我們的GUI中可能包含了多個(gè)widgets。在這種情況下,我們需要告訴QT如何安放這些widgets。例如。我們可以使用QVBoxLayout垂直堆放widget:

QVBoxLayout example

這個(gè)截圖的代碼如下:

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_()

一如既往,我們還是先創(chuàng)建了一個(gè)QApplication。接著我們創(chuàng)建了一個(gè)window。我們使用的是最基本的QWdiget,因?yàn)樗皇且粋€(gè)容器,用來(lái)放置widget,我們并不需要它有什么特殊的功能。然后,我們就創(chuàng)建了一個(gè)layout,還創(chuàng)建了兩個(gè)QPushButton放在里面。最后,我們告訴了window,我們需要使用這個(gè)layout。然后就跟我們的第一個(gè)GUI一樣,調(diào)用show()exec_()

當(dāng)然還有很多其他的layout,例如QHBoxLayOut等等。更多的風(fēng)格,可以在qt的網(wǎng)站上查閱

自定義風(fēng)格

QT一個(gè)比較強(qiáng)大的地方就是它支持自定義的用戶(hù)風(fēng)格。

風(fēng)格設(shè)置

比較直接的設(shè)置方式就是在我們的程序中直接指定全局的風(fēng)格。我們?cè)倏纯粗暗慕貓D:

Screenshot of common Qt widgets using the Fusion style

上面的這個(gè)窗口風(fēng)格稱(chēng)之為Flusion,我們也可以把他替換成Windows風(fēng)格:

Screenshot of common Qt widgets using the Windows style

通過(guò)qpp.setStyle(...)方法,我們就可以設(shè)置自己的風(fēng)格了。

from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...

具體支持什么樣的風(fēng)格依賴(lài)于我們使用的操作系統(tǒng),但是一般都支持以下的風(fēng)格:'Fusion', 'Windows', 'WindowsVista'(僅Windows支持) and 'Macintosh' (僅Mac支持)

自定義顏色

如果我們喜歡一種風(fēng)格,但是我們想改變一些顏色。那么我們就可以使用QPalette來(lái)實(shí)現(xiàn)我們的功能。例如:

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_()

執(zhí)行效果如下:

Screenshot of a QPushButton with red text in the Fusion style

面板風(fēng)格

除了上述的功能之外,我們還可以通過(guò)面板風(fēng)格來(lái)改變我們程序的外觀。這就是QT類(lèi)似于CSS的特性。我們可以通過(guò)以下的方法我們的面板添加一些空間:

from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()
Qt window with a button surrounded by extra space

更多關(guān)于面板風(fēng)格的信息,可以查看qt官網(wǎng)。

Signals / slots

QT 通過(guò)Signals(信號(hào))機(jī)制來(lái)讓我們對(duì)一些事件做響應(yīng),例如我們點(diǎn)擊了一個(gè)按鈕。下面的這個(gè)例子就是當(dāng)我們點(diǎn)擊按鈕時(shí),會(huì)彈出對(duì)話框。

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_()
PyQt QMessageBox saying that a button was clicked

button.clicked這就是個(gè)signal(信號(hào)),.connect(...)就是我們指定的與這個(gè)signal關(guān)聯(lián)的slot(槽)。上面這是一個(gè)簡(jiǎn)單的響應(yīng)函數(shù),當(dāng)我們點(diǎn)擊這個(gè)按鈕的時(shí)候,這個(gè)動(dòng)作(函數(shù))就會(huì)觸發(fā)。

Signals在QT中是無(wú)處不在的,用戶(hù)也可以定義自己的signal。

編譯屬于自己的APP

現(xiàn)在我們已經(jīng)有了一點(diǎn)關(guān)于GUI的基本知識(shí)了。但是當(dāng)我們寫(xiě)好一個(gè)程序之后,如何給別人使用呢?讓別人搭建環(huán)境,然后再把腳本給人家嗎?這肯定是不合理的,所以我們?cè)撛趺醋瞿兀?/p>

在python的世界中,將源碼轉(zhuǎn)換成一個(gè)可執(zhí)行的,這種操作稱(chēng)之為freezing。盡管現(xiàn)在已經(jīng)有很多的庫(kù)都可以解決這個(gè)問(wèn)題,例如:PyInstaller ,py2exe,cx_Freeze,bbfreze,py2app...但是這些傳統(tǒng)的庫(kù)用來(lái)freezing一個(gè)PyQt程序還是有點(diǎn)難度的。

這里我們使用一個(gè)全新的fbs庫(kù),它可以讓我們輕易的將python源碼轉(zhuǎn)換成一個(gè)執(zhí)行的PyQt程序。安裝fbs也很簡(jiǎn)單,執(zhí)行下面的命令就OK了:

pip install fbs

接著執(zhí)行:

fbs startproject

然后你就會(huì)看到下面的提示:

Commands for starting a new project with fbs

當(dāng)你輸入run之后,就會(huì)打開(kāi)一個(gè)空的窗口:

An empty window showing 'Hello World!' in its title

這就跟我們之前創(chuàng)建的一個(gè)qt程序相似。它會(huì)在我們的當(dāng)前目錄下創(chuàng)建一個(gè)文件src/main/python/main.py,然后我們可以試著把它編程一個(gè)可執(zhí)行的文件。

fbs freeze

這個(gè)命令就在你當(dāng)前的目錄的target/MyApp/子目錄有了一個(gè)可執(zhí)行的文件。然后我們就可以把它發(fā)送給別人了。

(注意:fbs現(xiàn)在支持Python 3.5 或者 3.6,如果你的版本不是二者之一,同時(shí)你的fbs還出現(xiàn)了問(wèn)題,建議你安裝Python 3.6再試試。)

小獎(jiǎng)勵(lì)![img]:創(chuàng)建一個(gè)安裝包

通過(guò)fbs installer命令我們還可以創(chuàng)建安裝包。

img
img

(如果你使用的Windows系統(tǒng),那么你需要先安裝NSIS,然后配置好環(huán)境變量)

線面的一篇文章說(shuō)明了如何使用fbs,另外你也可以看看fbs教程

文章

fbs 教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容