簡單易懂的PyQt Demo

喜歡程式設計嗎?想要一窺 KDE/Qt 程式設計的奧秘嗎?想要
學習 X Window 上的視窗程式設計嗎?歡迎各類關於 KDE/Qt、Qtopia、Qt/Embedded、QSA、PyQt 等各類心得討論。

版主: AceLan, Franklin

簡單易懂的PyQt Demo

文章訪客 » 週五 7月 30, 2010 11:47 am

http://csslayer.tk/wordpress/linux/qt-l ... pyqt-demo/

PyQtDemo.tar.gz

其實是專門為右京樣一兄所作,搞了一個非常簡單的視窗。閒話少說,我們來看看這個東西。
內容物很簡單。

.
├── build.py
├── demowindow.py
├── main.pyw
└── ui
└── demowindow.ui

首先需要運行./build.py根據ui檔生成一個py檔,然後./main.pyw就可以運行了。內容也超少,首先是main.pyw的內容:

代碼: 選擇全部
#!/usr/bin/env python
 
import sys
from PyQt4.QtGui import QApplication
from demowindow import DemoWindow
from PyQt4.QtCore import Qt, SIGNAL
 
if __name__ == "__main__":
    app = QApplication(sys.argv);
    app.connect( app, SIGNAL( "lastWindowClosed()" ), app.quit);
    demowindow = DemoWindow()
    demowindow.show()
    sys.exit(app.exec_())


原理很簡單,產生實體一個QApplication物件(Qt程式都需要),設置一個signal,表示所有視窗退出後程式退出。

然後產生實體了一個我們用Qt Designer創建的視窗,並顯示。

然後是demowindow.py的內容:

代碼: 選擇全部
from PyQt4.QtCore import Qt, SIGNAL
from PyQt4.QtGui import *
 
from ui_demowindow import Ui_DemoWindow
 
class DemoWindow(QWidget, Ui_DemoWindow):
    def __init__(self, parent = None):
        QWidget.__init__(self,parent)
        self.setupUi(self)
        self.connect(self.testButton, SIGNAL("clicked()"), self.test)
        self.connect(self.exitButton, SIGNAL("clicked()"), self.exit)
 
    def test(self):
        self.helloLabel.setText("abc");
 
    def exit(self):
        self.close()


內容依舊簡單明瞭,主要就是處理按鈕事件,按下Test就會把顯示的文字改成abc,按下Exit就是退出。初始化函數的慣例就是需要調用 setupUi,這個函數相當於處理了介面的構建。那麼原理是什麼樣子的呢?首先我們創建了一個ui檔(利用qt designer,塗塗畫畫什麼的,最簡單了,layout得自己玩玩才搞得明白)。然後利用pyuic4這個程式將ui檔轉換為python代碼 pyuic4 -o ui_demowindow.py ui/demowindow.ui,這裡這個python檔中會定義一個類Ui_classname,這個class name就是ui檔中頂級widget的名字(區分大小寫)。然後一般都是利用定義一個新類繼承Ui_類,和對應的Widget類型。然後在初始化的時 候調用setupUi(self)初始化介面。

然後解釋一下Qt的消息處理機制(個人理解),Qt的消息分為SLOT和SIGNAL,關聯SIGNAL和SLOT稱為connect。SIGNAL相當於一個事件,例如

代碼: 選擇全部
self.connect(self.testButton, SIGNAL("clicked()"), self.test)


這是什麼意思呢?就是在self.testButton這個按鈕產生clicked的SIGNAL時,調用test這個函數。connect就是將這個信號和SLOT(test)關聯起來。

P.S. 吐槽:右京樣一兄你的blog沒有trackback嗎?還是你的主題不支援trackback連結……我本來想trackback一下你的原始文呢。

P.S.的P.S. 我猜出trackback連結了……

參考資料:

http://www.riverbankcomputing.co.uk/sta ... t4ref.html
http://diotavelli.net/PyQtWiki/Creating ... t_Designer
訪客
 

回到 KDE/Qt 程式設計

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客