PyQt

入門到入門

什麼是 Qt

Qt 是一個功能強大的跨平台 C++ 應用程式開發框架,主要用於建立具備高階圖形使用者介面 (GUI) 的桌面、嵌入式及行動應用程式。它允許開發者編寫一次代碼,即可在 Windows、Linux、macOS、Android 和 iOS 等多種作業系統上編譯執行。– Google AI 

P.S. 理論上發音同 cute,但它沒有特別可愛

CLI vs GUI

CLI = Command Line Interface

GUI = Graphic User Interface

GUI 在 1984 年 Apple 推出 Macintosh 電腦之後盛行

據說下一個是 BCI

什麼是 PyQt

PyQt 是由一家名為 Riverbank Computing 的獨立公司開發的「Python 綁定(Python Bindings)」。

 

它將 Qt 的 C++ API 包裝起來,讓你可以用 Python 的語法來呼叫 Qt 的功能。

API (Application Programming Interface)是一組定義好的規則與協定,讓不同的軟體、系統或服務能相互連結。用戶端發出請求後,API 在後台處理並回傳資料。

PyQt vs PySide

PyQt PySide
開發公司 Riverbank  Qt 官方
授權 GPL LGPL

兩者在商業授權上有一點差異,但語法大致相同。

Setup

1 打開 vscode

2 建立一個資料夾

3 在終端機輸入指令

pip3 install pyqt6

4 在資料夾內建立一個 app.py

0. GUI 基礎

Application

名詞解釋

最頂層的東西,可以理解為應用程式本體。一個程式通常只能有一個 Application 。

Window

名符其實的視窗,即顯示畫面的地方。

Widget

名詞解釋

「元件」,是組成介面的最小單位。

舉凡按鈕、文字框等都是 Widget。

Layout

規範 Widget 的排列規則。

Qt 裡面有內建一些 Layout(水平、垂直等)

Signal

名詞解釋

Signal 和 Slot 的組合是 Qt 的一大特色。

Signal 即信號,指當某件事發生時,元件發出的通知

(例如:按鈕被按下了)。

Slot

接收到信號後,執行的動作(可能是一個 Python 函數)

如果你也是小時候寫 Scratch 的人

我覺得概念 87% 像

Event Loop

名詞解釋

GUI App 會隨時待命,一直偵測有沒有人發出訊號,是在後台運作的一個無窮迴圈。這套機制叫做 Event Loop。

1. Hello World

from PyQt6 import QtWidgets
from PyQt6.QtWidgets import QApplication, QMainWindow
import sys

def hello():
  app = QApplication(sys.argv)
  win = QMainWindow()
  win.setGeometry(200,200,300,300)
  win.setWindowTitle("Hello World")
  win.show()
  sys.exit(app.exec())
 
hello()
  

你的第一支 PyQt 程式

app = QApplication(sys.argv)

建立一個 application

sys.argv 是接收一些外部指令(點擊打開檔案等)

win = QMainWindow()

建立一個 window

win.setGeometry(200, 200, 300, 300)

setGeometry (x, y, 寬, 高)

win.setWindowTitle("Hello World") 

視窗標題

win.show()

顯示視窗

在 PyQt 中,建立一個Widget後,預設是隱藏的。

sys.exit(app.exec())

啟動 Event Loop

sys.exit() 關閉視窗結束事件迴圈時,確保 Python 環境乾淨地退出,並回傳狀態碼給作業系統。

def hello ():
  
  ...
  
hello()

是沒有一定要包成函式

不過後面寫得比較複雜後都用函式處理會比較乾淨

2. QWidgets

主要講以下幾種

QLabel (文字 / 圖片)

QPushButton (按鈕)

QSlider (滑桿)

QTextEdit(文字框)

QCheckBox(勾選框)

QComboBox(下拉選單)

 

QLabel

app = QApplication(sys.argv)
win = QMainWindow()
win.setGeometry(200, 200, 300, 300)
label = QtWidgets.QLabel(win)
label.setText("建北電資聯合寒訓")
label.resize(200, 200)
win.show()
sys.exit(app.exec())

也可以在裡面直接包 HTML

label.setText("<h1 style = 'color: blue;'> 建北電資聯合寒訓 </h1> ")

QLabel

font = QtGui.QFont() # 利用 QtGui 中的 QFont 方法建立一個新字體
font.setFamily("JetBrains Mono Nerd Font") # 更改字體樣式
font.setBold(True) # 字體粗細
font.setItalic(True) # 斜體
font.setUnderline(True) # 底線
font.setStrikeOut(True) # 刪除線
font.setPointSize(20) # 字體大小
label.setFont(font) # 將 label 的字體設定為 font
label.adjustSize() # 讓 label 的尺寸根據文字長度調整

或是用 QtGui.Qfont()

QPushButton

font = QtGui.QFont() # 利用 QtGui 中的 QFont 方法建立一個新字體
font.setFamily("JetBrains Mono Nerd Font") # 更改字體樣式
font.setBold(True) # 字體粗細
font.setItalic(True) # 斜體
font.setUnderline(True) # 底線
font.setStrikeOut(True) # 刪除線
font.setPointSize(20) # 字體大小
label.setFont(font) # 將 label 的字體設定為 font
label.adjustSize() # 讓 label 的尺寸根據文字長度調整

或是用 QtGui.Qfont()

Code

By Suzy Huang

Code

  • 57