PyQt - 维基百科,自由的百科全书
PyQt - 維基百科,自由的百科全書
PyQt
維基百科,自由的百科全書 跳轉(zhuǎn)至: 導(dǎo)航、 搜索| Riverbank Computing |
| 4.9.5/ 2012年9月29日?(2012-09-29) |
| Python[1] |
| 跨平臺(tái) |
| GNU GPL 和商業(yè)授權(quán) |
| PyQt官方網(wǎng)站 |
PyQt是Python語言的GUI編程解決方案之一。可以用來代替Python語言內(nèi)置的Tkinter。其它替代者還有PyGTK、wxPython等。與Qt一樣,PyQt是一個(gè)自由軟件。PyQt是PyKDE的基礎(chǔ)。
PyQt的開發(fā)者是英國的“Riverbank Computing”公司。與4.5版本之前的Qt一樣,它提供了GPL與商業(yè)協(xié)議兩種授權(quán)方式,因此它可以免費(fèi)地用于自由軟件的開發(fā)。不過目前尚不提供LGPL授權(quán)方式。PyQt可以運(yùn)行于Microsoft Windows、Mac OS X、Linux以及Unix的多數(shù)變種上。
2009年8月,Qt的開發(fā)公司Nokia發(fā)布PySide,提供與PyQt類似的功能,但提供了LGPL授權(quán)。主要原因是“Riverbank Computing”不愿以LGPL授權(quán)發(fā)布PyQt。[2]
自4.5版本以后[3],PyQt同時(shí)支持Python 2.x與Python 3.x。但是在API方面有所區(qū)別,最主要的是運(yùn)行在Python 3.x下的PyQt不使用QString,而是str。另外,之前為了避開Python 2.x關(guān)鍵詞限制的exec_()、print_()兩個(gè)函數(shù)現(xiàn)在重新命名為exec(),print()。
目錄?[隱藏]?
|
[編輯] PyQt組件
PyQt包含了大約440個(gè)類型、超過6000個(gè)的函數(shù)和方法。
- “QtCore”模塊主要包含了一些非GUI的基礎(chǔ)功能,包含事件循環(huán)與Qt的信號(hào)機(jī)制。此外,還提供了跨平臺(tái)的Unicode、線程、內(nèi)存映射文件、共享內(nèi)存、正則表達(dá)式和用戶設(shè)置。
- “QtGui”模塊包含了大多數(shù)的GUI類型。包含按鈕、文本框、列表等常見控件,還包含了基于MVC設(shè)計(jì)模式的列表、表格、樹型控件。同時(shí)還提供了一個(gè)能夠容納成千上萬個(gè)元素的畫布控件,其中可以放置各種控件和圖形。此外,還可以QtGui還支持界面動(dòng)畫與界面狀態(tài)機(jī)編程。
- “QtNetwork”模塊可以用于編寫非阻塞式的UDP、TCP程序。還包含了DNS、HTTP與FTP的客戶端。
- “QtOpenGL”模塊允許Qt程序使用OpenGL渲染3D圖形在,而且不必大量更改代碼。
- “QtSql”模塊支持多種SQL數(shù)據(jù)庫。包括sqlite、ODBC、MySQL、PostgreSQL、Oracle。還提供了一個(gè)基于MVC模式的數(shù)據(jù)模型,與QtGui的的表格控件配合使用。
- “QtXml”包含一個(gè)XML解釋器,同時(shí)支持SAX和DOM兩種編程方式。
- “QtWebkit”與“QtScript”兩個(gè)子模塊支持WebKit與EMCAScript腳本語言
- “Phonon”子模塊支持高級(jí)的多媒體編程。包含音頻播放器、視頻播放器與聲效處理。
- “uic”子模塊能夠?qū)t的窗體文件轉(zhuǎn)換為Python代碼,能夠即時(shí)讀入窗體文件并且顯示出來。它依賴于QtXml模塊。“QScintilla”子模塊包含一個(gè)基于Scintilla的文本編輯器控件,Eric IDE使用它作為代碼編輯器。“QtMultimedia”提供了底層的多媒體支持,現(xiàn)在多數(shù)開發(fā)者改用Phonon模塊。“QtSvg”支持SVG 1.2 Tiny的靜態(tài)標(biāo)準(zhǔn),用于顯示與保存SVG格式的圖形。
[編輯] 簡(jiǎn)單例子
下面一段代碼演示了一個(gè)簡(jiǎn)單的PyQt程序,它的功能是在窗體內(nèi)顯示一個(gè)按鈕,當(dāng)按下按鈕時(shí),要求用戶輸入名字。根據(jù)用戶是否輸入了名字,會(huì)分別顯示兩種問候語。
顯示▼隱藏▲示例程序的代碼# -*- coding: utf-8 -*- #該程序適合Python 2.ximport sys from 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("請(qǐng)問你的名字是?"), self.trUtf8(b"名字"))if not okay or yourName==u"": #用戶沒有輸入名字,或者是點(diǎn)了取消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_()) 結(jié)果[編輯] signal和slot
Qt采用了signal和slot的概念來處理GUI程序中的用戶事件。PyQt同樣支持這種方法,還進(jìn)而針對(duì)Python的特點(diǎn)增強(qiáng)了某些功能。任何Python類型都可以定義signal和slot,并與GUI控件的signal和slot相連接。PyQt支持old-style與new-style兩種連接方式。不過,目前一般推薦使用new-style connection。因?yàn)樗€支持連接到Python函數(shù),而且看起來也比較pythonic。
#old-style connection, self.connect(self, SIGNAL("mySignal(int)"), self, SLOT("mySlot(int)")) #new-style connection self.mySignal.connect(self.mySlot) #連接到函數(shù) self.mySignal.connect(lambda value:sys.stdout.write(str(value)))QMetaObject.connectSlotsByName(obj)函數(shù)可以幫助程序員自動(dòng)連接signal和slot。使用它可以免去很多代碼。
[編輯] Qt設(shè)計(jì)器
Qt設(shè)計(jì)器是Qt所包含的可視化UI設(shè)計(jì)器。在安裝PyQt時(shí),可以選擇安裝Qt設(shè)計(jì)器。它使用拖拉操作來設(shè)計(jì)圖形界面。在設(shè)計(jì)的同時(shí),還能夠直接預(yù)覽最終的窗體效體。當(dāng)窗體很復(fù)雜或者整個(gè)程序需要大量的窗體時(shí),Qt設(shè)計(jì)器可以節(jié)省大量的代碼。不過稍有改變的是,設(shè)計(jì)好窗體后需要運(yùn)行pyuic4這個(gè)腳本,將窗體文件轉(zhuǎn)換成Python代碼。仍以“簡(jiǎn)單例子”中的小程序?yàn)槔?#xff0c;首先使用Qt設(shè)計(jì)器設(shè)計(jì)出窗體。假定保存為"h:\pyqt_example.ui"。窗體文件內(nèi)容是:
顯示▼隱藏▲pyqt_example.ui的內(nèi)容<?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>問候(&S)</string></property></widget></item></layout></widget><resources/><connections/> </ui>使用如下命令將窗體文件轉(zhuǎn)換成Python代碼(適用于Windows系統(tǒng)):
H:\> C:\Python26\pyuic4.bat -o ui_pyqt_example.py pyqt_example.ui新的示例程序是(假定保存為h:\pyqt_example.py):
顯示▼隱藏▲pyqt_example.py的內(nèi)容# -*- coding: utf-8 -*- #該程序適合Python 2.x版本。import sys from PyQt4.QtGui import * #差異1:從轉(zhuǎn)換后的代碼里面導(dǎo)入窗體 from ui_pyqt_example import Ui_TestWidget#差異2:需要繼承Ui_TestWidget class TestWidget(QWidget, Ui_TestWidget):def __init__(self):QWidget.__init__(self)#差異3:原來長(zhǎng)篇累牘的創(chuàng)建控件的代碼不再需要了,取而代之的是一行簡(jiǎn)單的setupUi()self.setupUi(self)self.helloButton.clicked.connect(self.sayHello)def sayHello(self):yourName, okay=QInputDialog.getText(self, self.trUtf8("請(qǐng)問你的名字是?"), self.trUtf8(b"名字"))if not okay or yourName==u"": #用戶沒有輸入名字,而是點(diǎn)了取消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_())[編輯] PyQt的優(yōu)劣
[編輯] 優(yōu)勢(shì)
- PyQt的API與Qt類似,Qt的文檔通常仍然可以應(yīng)用于PyQt。因此,PyQt的文檔比PyGTK、wxPython、Tkinter等GUI編程庫的文檔豐富得多。
- 如果程序員具備使用Qt的經(jīng)驗(yàn),一般很快就可以過渡到PyQt上。而使用PyQt的程序員,如果同時(shí)精通C++的話,也可以很快地過渡到Qt平臺(tái)上。
- 利用SIP,大多數(shù)為Qt開發(fā)的控件可以方便地port到PyQt。——然而,SIP也需要一些學(xué)習(xí)成本。
- 有方便的周邊工具支持PyQt。如QtDesigner,可以使用拖拉式的方法來設(shè)計(jì)界面,簡(jiǎn)單易用。Eric4,一個(gè)使用PyQt設(shè)計(jì)的Python IDE,對(duì)PyQt有特殊的支持。
[編輯] 劣勢(shì)
- 由于PyQt同時(shí)使用Qt以及Python的兩種內(nèi)存管理方法,所以在使用PyQt的過程中要注意避免內(nèi)存泄露以及懸掛指針[4]。
- 運(yùn)行時(shí)龐大,在Windows平臺(tái),只使用PyQt.QtCore與PyQt.QtGui兩個(gè)子模塊時(shí),壓縮后至少需要4.09M
- 需要學(xué)習(xí)一些C++知識(shí),主要是C++類型、內(nèi)存管理兩個(gè)方面,以便于閱讀Qt文檔和理解PyQt的行為。
[編輯] SIP
SIP是一個(gè)自動(dòng)為C和C++庫生成Python擴(kuò)展模塊的工具。為了方便開發(fā)PyQt,SIP于1998被“Riverbank Computing”公司創(chuàng)造出來。不過,SIP不專用于PyQt,而是適用于所有的C和C++庫。
使用SIP時(shí),程序員首先要編寫一個(gè)特殊的".sip"文件,使用類似于C++的語法在其中描述擴(kuò)展模塊所提供的類型與函數(shù)。然后用SIP將這個(gè)文件轉(zhuǎn)化為C++代碼。最終編譯,與C、C++庫鏈接后就成為Python擴(kuò)展模塊。".sip"文件類似于C、C++的頭文件。根據(jù)需要,需要程序員用SIP定義的語法添加一些C++代碼中沒有的信息。因?yàn)镾IP不支持完整的C++語法,所以不能直接使用C++的頭文件作為".sip"文件。
總結(jié)
以上是生活随笔為你收集整理的PyQt - 维基百科,自由的百科全书的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改Eclipse格式化代默认长度
- 下一篇: Matlab中的一些小技巧