Hello , PyQt4


使用Python寫複雜GUI是件麻煩的事,縱使之前使用了wxPython,沒有drag & drop 的IDE,就總是不想用Python來寫Windows Application。

還好,遇見了PyQt4。

不過,使用PyQt4的人確實是少眾,我目前使用的參考資料有:

More about Rapid GUI Programming with Python and Qt

不過書跟資料都是寫hard code的,下面就示範使用Qt拉UI畫面,再用Python來寫code的方式。


安裝:

PuQt安裝時建議文件跟範例要選取,裡面的Document只有Reference Guide。
裝完的預設目錄是 Python25\Lib\site-packages\PyQt4。

QT4_1

開發步驟為:

1. 使用QT Designer 畫UI
QT4_2

可以看到Qt Designer已經具備了大部份的UI元件。

我們首先選擇Dialog without Button。
將Label 及Push Button 拖曳至dialog上。(元件上的文字請自行決定)

 QT4_6

接著編輯信號如下:

QT4_4

這信號的用途是指,等等按下button後,label上的文字就會更改。

將檔案儲存為hello.ui。

2.轉檔
首先要將ui檔轉成py file,使用下面的指令:

pyuic4 -o hello.py hello.ui

3.用python寫code

產生出來的hello.py程式碼為:

from PyQt4 import QtCore, QtGui
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(179, 152)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(30, 100, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(40, 60, 47, 14))
        self.label.setObjectName("label")
        self.retranslateUi(Dialog)
        #QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.label.update)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Dialog", "Click me!", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "Hello", None, QtGui.QApplication.UnicodeUTF8))

上面藍色那行,記得先mark掉。

接著我們寫一個Hellomain.py來引用UI 的class:

# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from hello import Ui_Dialog
class StartQT4(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.label_change)
    def label_change(self):
        self.ui.label.setText('hello pyqt4')
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

程式說明:
1.記得將引用的UI格式(QtGui.QDialog)放入,否則在init時就不會過。

2.指定self.ui,就是將QtDesigner所產生的UI指定給self。

3.將hello.py中的藍字,copy到這兒更改,基本上connect就是將A元件的某個事件跟B元件要執行的動作綁在一起。
因為我將label的事件處理放在StartQT4的class中處理,所以事件定義(label_change)放在下面;要注意,原來hello.py中的self.pushButton在這兒就變成self.ui.pushButton。
(self.label.update改成self.label_change,沒什麼特別的意思;還有,不懂self的小朋友,請自行解決。)

4.使用show()將UI呈現出。

最後執行 Hellomain.py就可以了。

QT4_5

中文問題:

若將self.ui.label.setText('hello pyqt4') 中的文字改成中文,使用dos command時勢必會出現亂碼,這不是unicode的問題,所以,不管你用decode或是加個u,問題一樣無法解決,這是因為dos command預設的語系是MS950,所以要將decode改成如下:

str = '中文 pyqt4'.decode('MS950')
self.ui.label.setText(str)

會出現這樣的問題是因為,若你用pydev開發時跑都沒有問題,但用py2exe包好後,在執行程式時會先呼叫的是dos command,所以就會發生這樣的狀況,要注意。

2 意見:

rtfgvb766 提到...

IS VERY GOOD..............................

Fred Wang 提到...

我是初學者, 非常感謝