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"文件。