一般來說,用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 配置無誤。