用 VS Code 搞Qt6:使用 PySide 6

2022-10-06 15:00:38

一般來說,用C++寫 Qt 應用才是正宗的,不過,為了讓小學生也能體驗 Qt 的開發過程,或者官方為了增加開發者人數,推出了可用 Python 來程式設計的 Qt 版本。此版本命名比較奇葩,叫 PySide,與 Qt 6 配套的是 PySide 6。當前最新版本是 6.3.2。

PySide 的優勢在於它是官方維護的,完全是C++開發的。在原有庫基礎上增加了對應的 .pyd 檔案,對 API 做了封裝,並由 .pyi 檔案進行型別規範。在效能上是不用擔心的,但是,這種開發方式用來學習較適合,真要做個應用程式,還是用C++好,編譯出來就能用了。Python 寫的話打包要用其他工具,也麻煩,對於指令碼語言,還得到處帶上個解析器。

PySide 6 可以通過 pip 直接安裝就行了。

在安裝之前,老周建議先建立個虛擬環境。一來專用性強,二來方便打包。假設我要把虛擬環境存放在神奇的 E 盤下的 MyEnv 目錄下,那麼,可以執行:

python -m venv E:\MyEnv

或者

python3 -m venv E:\MyEnv

虛擬環境可以建立一個隔離的區域,有獨立的 python 解析器、pip 程式等。每個虛擬環境互不干擾。在虛所環境的 Scripts 目錄(Linux是 bin 目錄)下,有兩個檔案很有用。要啟用虛擬環境,就執行 activate 檔案;要退出虛擬環境,執行 deactivate 檔案。

接下來在剛建立的虛擬環境中安裝 PySide 6。先執行 activate 檔案啟用環境,然後執行命令:

pip install PySide6

如果不能下載或下載特慢,請換國內的清華大學源。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PySide6

詳細的使用方法請自行檢視幫助說明,此話題對本文而言已超綱。

------------------------------------------------------------------------------------------------------------------------------------

接下來該到 VS Code 了。不需要什麼特殊設定,安裝微軟官方的 Python 擴充套件即可。

但是,不過,可是,然而,要注意:要先執行虛擬環境中的 activate 檔案,然後在當前執行環境不變的前提下啟動 VS Code。在VS Code中也需要使用虛擬環境所設定的環境變數。為了人性化,咱們可以在桌面上建一個批次檔,然後輸入以下內容:

@echo off
call E:\MyEnv\Scripts\activate.bat
start C:\<你的VS Code 路徑>\VSCode\Code.exe
exit

第一行不解釋了,可自行度娘。第二行是用 CALL 命令呼叫 activate 檔案(在 Windows 上它是個批次檔),這樣虛擬環境就啟用了。第三行使用 start 命令啟動 VS Code,這樣 VS Code 就具備了虛擬環境的上下文和環境變數了。第四行退出這個批次檔,這是為了關掉命令列視窗。此處不必理會 deactivate 檔案,畢竟 VS Code 退出後,虛擬環境相關的環境變數就沒有了。

當我們要用 PySide 6 時,直接執行批次檔就完事了。

 

===================================================================================

PySide 6 的各種型別、模組與 C++ 版本是一樣的,只要你會寫 Python 程式碼,基本上可以直接遷移。當然,千萬不要像官方檔案那樣遷移,因為檔案的 Python 程式碼估計是通過機器翻譯的,直接將 C++ 譯成 Python。所以,你會看到官方檔案有很多 Python 程式碼是錯的,根本不能執行。有的連語法都保留了 C++ 特徵,壓根就不是 Python 程式碼。

儘管不能直接把 C++ 程式碼轉換成 Python 程式碼,但是按照 C++ Qt 程式的思路來寫程式碼是沒問題的。由於程式語言差異性,是不可能完全相容的。比如,C++ 版中的許多宏,你不能在 Python 中使用。假如你要從 QObject 類派生,為了使其支援訊號和槽,要加上 Q_OBJECT 宏。在 Python 中不需要加,也沒有這個,官方封裝的庫會幫我們完成這個。再如,C++ 中過載的運運算元 <<、>> 也不能用,PySide 中沒有 QDebug。

在 VS Code 中,解析器選擇咱們上面建立的虛擬環境。然後新建一個程式碼檔案,名字隨便取。寫個簡單程式試試。

# 匯入要用到的型別
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget

# 自定義類,作為視窗
class MyWindow(QWidget):
    # 建構函式
    def __init__(self, parent = None):
        super().__init__(parent, Qt.Window)
        # 設定視窗標題
        self.setWindowTitle("智慧掏糞機")
        # 設定視窗大小
        self.resize(260, 185)

#-------------------------------------------------
if __name__ == '__main__':
    # 先範例化 app 物件
    app = QApplication()
    # 再範例化視窗類物件
    win = MyWindow()
    # 顯示視窗
    win.show()
    # 啟動訊息迴圈
    app.exec()

最後啟動應用程式的程式碼也可以這樣寫:

if __name__ == '__main__':
    import sys
    # 先範例化 app 物件
    app = QApplication(sys.argv)
    # 再範例化視窗類物件
    win = MyWindow()
    # 顯示視窗
    win.show()
    # 啟動訊息迴圈
    sys.exit(app.exec())

執行此程式碼檔案,效果如下圖:

 

看到上述視窗,說明 PySide 6 設定無誤。