PyQt

簡單例子

下面一段程式碼演示了一個簡單的PyQt程式，它的功能是在表單內顯示一個按鈕，當按下按鈕時，要求用戶輸入名字。根據用戶是否輸入了名字，會分別顯示兩種問候語。
# -*- coding: utf-8 -*-#该程序适合Python 2.ximport sysfrom PyQt4.QtGui import *class TestWidget(QWidget):
    def __init__(self):
        QWidget.__init__(self, windowTitle=u"A Simple Example for PyQt.")
        self.outputArea=QTextBrowser(self)
        self.helloButton=QPushButton(self.trUtf8("问候(&S)"), self)
        self.setLayout(QVBoxLayout())
        self.layout().addWidget(self.outputArea)
        self.layout().addWidget(self.helloButton)

        self.helloButton.clicked.connect(self.sayHello)

    def sayHello(self):
        yourName, okay=QInputDialog.getText(self, self.trUtf8("请问你的名字是?"), self.trUtf8(b"名字"))
        if not okay or yourName==u"": #用户没有输入名字，或者是点了取消
            self.outputArea.append(self.trUtf8("你好，陌生人！"))
        else:
            self.outputArea.append(self.trUtf8("你好，<b>%1</b>。").arg(yourName))app=QApplication(sys.argv)testWidget=TestWidget()testWidget.show()sys.exit(app.exec_())

signal和slot

Qt採用了signal和slot的概念來處理GUI程式中的用戶事件。PyQt同樣支援這種方法，還進而針對Python的特點增強了某些功能。任何Python類型都可以定義signal和slot，並與GUI控制項的signal和slot相連接。PyQt支援old-style與new-style兩種連接方式。不過，目前一般推薦使用new-style connection。因為它還支援連接到Python函式，而且看起來也比較pythonic。
#old-style connection，self.connect(self, SIGNAL("mySignal(int)"), self, SLOT("mySlot(int)"))#new-style connectionself.mySignal.connect(self.mySlot)#连接到函数self.mySignal.connect(lambda value:sys.stdout.write(str(value)))
QMetaObject.connectSlotsByName(obj)函式可以幫助程式設計師自動連接signal和slot。使用它可以免去很多程式碼。

Qt設計器

Qt設計器是Qt所包含的視覺化UI設計器。在安裝PyQt時，可以選擇安裝Qt設計器。它使用拖拉操作來設計圖形介面。在設計的同時，還能夠直接預覽最終的表單效體。當表單很複雜或者整個程式需要大量的表單時，Qt設計器可以節省大量的程式碼。不過稍有改變的是，設計好表單後需要執行pyuic4這個指令碼，將表單檔案轉換成Python程式碼。仍以「簡單例子」中的小程式為例，首先使用Qt設計器設計出表單。假定儲存為"h:\pyqt_example.ui"。表單檔案內容是：
<?xml version="1.0" encoding="UTF-8"?><ui version="4.0">
 <class>TestWidget</class>
 <widget class="QWidget" name="TestWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>361</width>
    <height>271</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>A Simple Example for PyQt.</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QTextBrowser" name="outputArea"/>
   </item>
   <item>
    <widget class="QPushButton" name="helloButton">
     <property name="text">
      <string>问候(&amp;S)</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/></ui>
使用如下命令將表單檔案轉換成Python程式碼（適用於Windows系統）：
H:\> C:\Python26\pyuic4.bat -o ui_pyqt_example.py pyqt_example.ui
新的範例程式是（假定儲存為h:\pyqt_example.py）：
# -*- coding: utf-8 -*-#该程序适合Python 2.x版本。import sysfrom PyQt4.QtGui import *#差异1：从转换后的代码里面导入窗体from ui_pyqt_example import Ui_TestWidget#差异2：需要继承Ui_TestWidgetclass TestWidget(QWidget, Ui_TestWidget):
    def __init__(self):
        QWidget.__init__(self)
        #差异3：原来长篇累牍的创建控件的代码不再需要了，取而代之的是一行简单的setupUi()
        self.setupUi(self)
        self.helloButton.clicked.connect(self.sayHello)

    def sayHello(self):
        yourName, okay=QInputDialog.getText(self, self.trUtf8("请问你的名字是?"), self.trUtf8(b"名字"))
        if not okay or yourName==u"": #用户没有输入名字，而是点了取消
            self.outputArea.append(self.trUtf8("你好，陌生人！"))
        else:
            self.outputArea.append(self.trUtf8("你好，<b>%1</b>。").arg(yourName))app=QApplication(sys.argv)testWidget=TestWidget()testWidget.show()sys.exit(app.exec_())

SIP

SIP是一個自動為C和C++庫生成Python擴充模組的工具。為了方便開發PyQt，SIP於1998被「Riverbank Computing」公司創造出來。不過，SIP不專用於PyQt，而是適用於所有的C和C++庫。
使用SIP時，程式設計師首先要編寫一個特殊的".sip"檔案，使用類似於C++的語法在其中描述擴充模組所提供的類型與函式。然後用SIP將這個檔案轉化為C++程式碼。最終編譯，與C、C++庫連結後就成為Python擴充模組。".sip"檔案類似於C、C++的標頭檔。根據需要，需要程式設計師用SIP定義的語法添加一些C++程式碼中沒有的資訊。因為SIP不支援完整的C++語法，所以不能直接使用C++的標頭檔作為".sip"檔案。