2009年4月19日

[PyQt 教學] Part 1: Introduction

因為我對 PyQt 頗為有愛 ( 以前用它寫過 Money Expenser ),所以打算生一點 PyQt4 的入門文......

( 礙於個人知識與經驗的有限,難以保證所述完全正確;若有發現錯誤,請提出指正。)


對於初學程式設計的人來說,一項很大的挫折,就是只能在黑黑的屏幕印出九九乘法表,一點 fu 也沒有。不精研演算法之類玩意兒的話,還是得寫出可以點來點去的圖形介面 ( Graphical User Interface ),會比較有成就感。

以工學院常教的 C/C++ 來說,standard 內並無包含 GUI 的部份;想寫 GUI,就得借助一些現成 library / framework 的幫助。選擇很多,滿地都是,但其中個人最有愛的是 Qt ( ......也只摸過這個 )。這系列教學文簡單介紹較好寫的 Qt Python binding - PyQt,期能對對這方面有興趣的人們有些幫助。

當然啦!萬丈高樓平地起;若沒先打好一些程設基本功 ( 像是物件導向概念 ) 的話,一路走下去終究還係會躺平在路邊的......


關於 Qt 的簡介,可參考以前寫的 Qt 介紹與安裝 前幾段。這些日子以來,又有了不小的變動:Trolltech 被 Nokia 收購 + 改名為 Qt Software;Qt 版號進展到 4.5;最大的改動大概就是從 4.5 版起,Qt 適用 LGPL 吧!

至於 PyQt,則是 Qt 的 Python binding。Qt 原本是用 C++ 寫成的 framework,呼叫 API 時得用 C++ 語法;為了方便使用其它程式語言的人用,出現了像是 Java、Ruby、Perl 等 binding。PyQt 讓大家可用 Python 語法調用 C++ Qt API,誠可謂佛心。比起用 C++ 寫,Python 語法的複雜度與長度都少多了,也不用 compile,嚴重省心,開發起來很是愉快 (>ω<)♪♪

( 相對地,執行效率就會比 native C++ 差一些...... 用電腦高速增長的處理速度來換取開發時間吧。)

但是畢竟係截然不同的語言,光是 C++ static typing vs. Python dynamic typing 就已有鴻溝;因此,在 PyQt 中可能看到一些因 C++ 而來的怪異語法,例如:

self.connect(tabWidget, SIGNAL('currentChanged(int)'), self.tabChanged)

這樣提及特定型別的玩意兒。

既然寄 C++ 籬下,得過且過罷;好在 PyQt 的維護者頗為有心,在 roadmap 提及許多讓語法更加 pythonic 的改變。例如前述 typing 問題,自 PyQt 4.5 起將可用這樣的寫法完成:

tabWidget.currentChanged.connect(self.tabChanged)

優美許多 (>ω<)♪♪

此外還有許多改變,像是 Python v3 support、更多的語言整合等,前景是蠻可期的。( 很好奇 Qt 4.5 轉換成 LGPL 有對 PyQt 維護公司造成怎樣的影響...... )

( 更新:PyQt 4.5 已於 6 月 6 號發佈。)
( 更新:Riverbank 決定維持 PyQt 的 GPL/Commercial 雙授權型式。Nokia 交涉未果,只好又造了一個 LGPL 的輪子 PySide... )

以 PyQt 寫成的著名軟體,包括 Python IDE Eric 和 Linux 遊戲管理器 djl 等,都是優秀的例子。


想學 PyQt 的話,自然前提就是要先會 Python ( 尤其是物件導向部份 )。這方面,如果已有其它高階語言編程經驗的話,讀讀 Python 官方的 Tutorial 還不錯。Quick Reference 也是個好東西。Python 本身算是好學易用的語言,學起來不會後悔

另外,最好還是能有些 C++ 背景;因為開發過程就是猛力翻找 API 文檔,而目前 PyQt 自身的文檔還不成熟,讀起來幾乎像是 C++ 官方版的重度閹割版,也沒專門的查閱工具。所以腦內內建轉換能力,直接衝 C++ API reference 會比較好。

至於 Qt / PyQt,其實都已經有 tuto rial 了。不過基於食飽太撐,我接下來還是會自己搞個幾篇出來 =3=

最後需要注意一下,PyQt 目前使用的 license 是 GPL;若有顧慮的話請趁早收手......


那麼 introduction 就到這裡。我們下次再見 ^.<∼*

[PyQt 教學] Part 2: 建構開發環境

2 則留言:

  1. 如果擔心 GPL 的問題,可以試試 PySide,這個綁定是LGPL的

    http://www.pyside.org/

    回覆刪除
  2. 呵呵,Nokia 與 Riverbank 協商未果,又讓開源界多滾一個輪子了......

    回覆刪除