Python pyQt4學習筆記1

來源:互聯網
上載者:User

標籤:title   應用   技術分享   sse   標籤   stat   客戶   hint   sans   

PyQt4是用來編寫有圖形介面程式(GUI applications)的一個工具包。PyQt4作為一個Python模組來使用,它有440個類和超過6000種函數和方法。同時它也是一個可以在幾乎所有主流作業系統(如Unix,windows,Mac OS)上啟動並執行跨平台的工具包。

PyQt4的類庫可分為以下模組:

  • QtCore
  • QtGui
  • QtNetwork
  • QtXml
  • QtSvg
  • QtOpenGL
  • QtSql

其中QtCore包含了PyQt非GUI功能模組的核心部分,這個模組用來對時間、檔案和目錄、不同的資料類型、流、URL、資源的媒體類型、線程和進程進行處理。 
QtGui包含了圖形相關的組件和類庫,包括按鈕(button)、視窗(window)、狀態列(status bar)、工具列(toolbar)、滑塊(slider)、位元影像(bitmap)、顏色(color)和字型(font)等等【這些名詞的英文我們在編程中會經常用到】。 
QtNetwork包含了網路編程相關模組。這些類庫有助於TCP/IP編程和用戶端&伺服器端的UDP編程,使得網路編程更加簡單和輕便。 
QtXml包含處理Xml檔案的類庫。這個模組提供了對SAM和DOM介面的實現。 
QtSvg提供了顯示svg檔案的類庫。SVG,全稱Scalable Vector Graphics,即可縮放向量圖形,是一種基於xml的描述二維圖形和映像應用的檔案格式。 
QtOpenGL是用OpenGL庫來渲染2D、3D映像的模組。它可以使Qt GUI庫和OpenGL庫無縫接合【好厲害的樣子】。 
最後,QtSql模組提供了處理資料庫的類庫。

 

其它GUI架構

寫GUI程式的Python程式員可以在這三種架構中選擇:PyQt,PyGTK和wxPython。

 

例子:產生一個空白視窗

 

 1 import sys 2 from PyQt4 import QtGui 3  4 def main(): 5     app=QtGui.QApplication(sys.argv) 6     w=QtGui.QWidget() 7     w.resize(250,150) 8     w.move(300,300) 9     w.setWindowTitle(‘Simple‘)10     w.show()11     sys.exit(app.exec_())12 13 if __name__==‘__main__‘:14     main()

 

w = QtGui.QWidget()

QtGui.QWidget是PyQt4所有使用者介面對象中的基礎類庫。我們在這裡調用了QtGui.QWidget的預設建構函式,這個構造沒有父物件。我們把沒有父物件的組件(widget)叫做視窗(window)

 

例子:按鈕,控制項事件,控制項提示,表單顯示到螢幕中間,messagebox
import sysfrom PyQt4 import QtGui,QtCoreclass winForm(QtGui.QWidget):    def __init__(self):        super(winForm,self).__init__()        self.initUI()    def initUI(self):        QtGui.QToolTip.setFont(QtGui.QFont(‘SansSerif‘,10))        self.setToolTip(‘this is a <b>QWidget</b> widget‘)        btn=QtGui.QPushButton(‘Button‘,self)        btn.setToolTip(‘this is a <b>QPushButton</b> widget‘)        btn.resize(btn.sizeHint())        btn.move(50,50)                btn1=QtGui.QPushButton(‘Quit‘,self)        btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)        btn1.resize(btn1.sizeHint())        btn1.move(150,50)                self.setGeometry(300,300,250,150)        self.setWindowTitle(‘Tooltips‘)
     self.setWindowIcon(QtGui.QIcon()) self.center() self.show() def closeEvent(self,event): res=QtGui.QMessageBox.question(self,‘info‘, "你要確定退出嗎?",QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No) if res==QtGui.QMessageBox.Yes: event.accept() else: event.ignore() def center(self): qr=self.frameGeometry() cp=QtGui.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def main(): app=QtGui.QApplication(sys.argv) ex=winForm() sys.exit(app.exec_())if __name__==‘__main__‘: main()

 

下面是程式的運行效果,依次示範了控制項提示,messagebox彈窗

      

 

下面解說上面的代碼:

class winForm(QtGui.QWidget):    def __init__(self):        super(winForm,self).__init__()

這裡我們建立了一個新的類叫做winForm,括弧中的QtGui.QWidget表明這個Example類是從QtGui.QWidget類繼承來的。這意味著我們為新類寫建構函式時需要調用父類的建構函式。super(Example, self)返回了Example的父物件(即QtGui.QWidget),接著我們調用了父物件的建構函式。注意__init__是Python中的建構函式。

注意:你必須調用父類的建構函式,否則會出現運行錯誤:

RuntimeError: super-class __init__() of type winForm was never called

 

 QtGui.QToolTip.setFont(QtGui.QFont(‘SansSerif‘,10))        self.setToolTip(‘this is a <b>QWidget</b> widget‘)        btn=QtGui.QPushButton(‘Button‘,self)        btn.setToolTip(‘this is a <b>QPushButton</b> widget‘)

我們調用setTooltip()這個方法,我們還可以使用html標籤!真是想不到。筆者突然想有空可以試試加入div標籤,走馬燈標籤和超連結標籤試試。

 btn.resize(btn.sizeHint())        btn.move(50,50)

我們設定了按鈕的大小,位置。其中sizeHint()方法返回了一個推薦的大小

 btn1=QtGui.QPushButton(‘Quit‘,self)        btn1.clicked.connect(QtCore.QCoreApplication.instance().quit)        btn1.resize(btn1.sizeHint())        btn1.move(150,50)

這段代碼就是那個名為Quit的按鈕,它是一個push button,點擊它程式就退出。

我們在例子中要使用的QtGui.QPushButton的建構函式原型是這樣的:

QPushButton(string text, QWidget parent = None)

其中text參數是按鈕上顯示的文字。parent參數是組件的父物件,在這裡就是我們要把按鈕放在什麼上,本例中是一個QtGui.QWidget【其實是一個視窗(window)】

這裡我們創造了一個按鈕(push button),它是QtGui.QPushButton類的一個執行個體。第一個參數是按鈕上的文字‘Quit’,第二個參數是父物件,這裡就是我們建立的winForm了,也就是self,它繼承自QtGui.QWidget類【Example沒有父物件,是一個視窗(window),記得嗎】。

PyQt4中的事件處理系統是由訊號槽機制(signals and slots)實現的。如果我們點擊了這個按鈕,就會發出“clicked”這個訊號。QtCore.QCoreApplication這個東西包含了程式的主迴圈,它處理和指派所有的事件,而instance()方法返回的是目前的執行個體(insatnce)。注意到QtCore.QCoreApplication隨著QtGui.QApplication的建立而建立,而由於我們這裡用connect()函數將“clicked”事件和可以終止應用的quit()函數聯絡(connect)在了一起,所以點擊按鈕,應用終止。這種交流在兩個對象之間完成:寄件者和接受者,其中寄件者是按鈕,接受者是應用本身。

        self.setGeometry(300,300,250,150)        self.setWindowTitle(‘Tooltips‘)        self.setWindowIcon(QtGui.QIcon())        self.center()        self.show()

這段代碼設定表單的顯示位置、大小、標題、程式表徵圖,最後把表單顯示出來。還有一個自訂的函數center,用於表單置中顯示。(你可以注釋self.center()來看看有什麼不同)

由於我們是繼承 QtGui.QWidget類,我們的新類winForm其實就是一個組件(widget),有widget的所有方法,這三個方法就都出自widget。 

setGeometry這個方法,它做了兩件事情:將組件定位並設定了它的大小【其實就是resize和move的混合函數】。前兩個參數是組件相對於父元素的x,y座標【這裡其實是個視窗(window),沒有父元素記得嗎?所以是螢幕上的x,y座標。】,後兩個參數是組件的寬和高

setWindowIcon這個方法,它設定了應用的表徵圖。為了做到這一點,我們建立了一個QtGui.QIon對象,建立時的參數就是我們想要的表徵圖的路徑

def center(self):        qr=self.frameGeometry()        cp=QtGui.QDesktopWidget().availableGeometry().center()        qr.moveCenter(cp)        self.move(qr.topLeft())

自訂的函數center,用於表單置中顯示

其中QtGui.QDesktopWidget這個類提供了使用者案頭的資訊,包括螢幕大小。

frameGeometry方法得到了主視窗的矩形架構qr

QtGui.QDesktopWidget().availableGeometry().center() 這些方法來得到螢幕解析度,並最終得到螢幕中間點的座標cp

qr.moveCenter(cp) 將矩形架構移至螢幕正中央,大小不變

self.move(qr.topLeft())  最後我們將應用視窗移至矩形架構的左上方點,這樣應用視窗就位於螢幕的中央了【注意組件的move都是左上方移動到某點】。

 

  def closeEvent(self,event):        res=QtGui.QMessageBox.question(self,‘info‘,                "你要確定退出嗎?",QtGui.QMessageBox.Yes |                                       QtGui.QMessageBox.No,                                       QtGui.QMessageBox.No)        if res==QtGui.QMessageBox.Yes:            event.accept()        else:            event.ignore()

這段代碼出彈窗,使用者可以確認或者取消操作。

根據類定義,如果關閉QtGui.QWidget,QtGui.QCloseEvent將會執行。所以為了達到我們的目的,我們需要重新定製closeEvent()這個事件控制代碼(event handler)。看來類似於C#中的重寫虛函數。

 

Python pyQt4學習筆記1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.