雜家雜談 |
|
|||
日歷
統(tǒng)計
導航留言簿(2)隨筆分類隨筆檔案Python搜索積分與排名
最新評論
閱讀排行榜 |
?? 在這個部分,我們開始學習一些PyQt4的基本功能,解釋會比較詳細,就像教孩子說話一樣。
最簡單的example ??? 下面的示例會非常的簡單,僅僅顯示一個小窗口,但是將來我們可以通過這個小窗口做很多事情。我們可以對它進行縮放,最大化,最小化。而這些就需要比較多的代碼了。但是開發(fā)人員已經(jīng)幫我們完成了這些功能,因為這些功能在大多場合都會使用到,所以沒有必要讓我們重復。PyQt是一個高級別的工具庫,如果使用級別相對較低的庫開發(fā)下面的功能,就非常可能需要更多的代碼了。 ?1 ![]() ?2 ![]() ?3 ![]() ?4 ![]() ?5 ![]() ?6 ![]() ?7 ![]() ?8 ![]() ?9 ![]() 10 ![]() 11 ![]() 12 ![]() 13 ![]() 14 ![]() 15 ![]() ??? 下面對代碼進行分析 import?sys ???? 這里,我們導入了必要的模塊,PyQt4的基本模塊都在QtGui中。from?PyQt4?import?QtGui app?=?QtGui.QApplication(sys.argv) ???? 每一個PyQt4程序都必須創(chuàng)建一個application對象,application類位于QtGui模塊中。sys.argv傳入命令行參數(shù)。Python腳本可以通過shell運行,這樣我們就可以對程序的啟動進行控制。widget?=?QtGui.QWidget() ???? QWidget是PyQt4中所有用戶接口對象的基類,我們使用QWidget默認的構造方法來創(chuàng)建QWidget對象,默認的構造方法沒有指定父控件,如果一個widget沒有指定父控件,那么我們就稱他為一個window。widget.resize(250,?150) ??? resize()方法調(diào)整widget的大小,在這里我們設定寬度為250px,高度為150px。widget.setWindowTitle('simple') ???
setWindowTitle()方法設置了窗口的title,title在titlebar中顯示。widget.show() ???
調(diào)用show()方法將窗口顯示出來。sys.exit(app.exec_()) ???
最后,就會進入application的事件循環(huán)。事件處理就從這里開始,循環(huán)不斷的從窗口接受需要處理的事件,然后將其分發(fā)給相應的時間處理方法。通過調(diào)用exit()方法或者銷毀widget來終止事件循環(huán),調(diào)用sys.exit()方法確保了程序可以明確的退出,也就是程序退出后會告知系統(tǒng)。也許你會問,為什么exec_()方法最后會有一個下劃線?問得非常好,這完全是因為exec是python的一個關鍵字,所以我們不得不使用exec_來代替。 ![]() 圖1:simple 添加圖標 ?? 應用程序的圖標一般就是一個在程序標題欄左上角顯示的小圖片,下面的例子我們展示如何使用PyQt4來顯示圖標,同時引入一些新的方法。 ?1?#!/usr/bin/python ??? 程序使用的是類似C語言的過程式風格,Python同時支持過程式和面向對象式的編程風格。需要注意的是,在使用PyQt4時,意味著面向對象編程。?2? ?3?#?icon.py ?4? ?5?import?sys ?6?from?PyQt4?import?QtGui ?7? ?8?class?Icon(QtGui.QWidget): ?9?????def?__init__(self,?parent=None): 10?????????QtGui.QWidget.__init__(self,?parent) 11? 12?????????self.setGeometry(300,?300,?250,?150) 13?????????self.setWindowTitle('Icon') 14?????????self.setWindowIcon(QtGui.QIcon('icons/web.png')) 15? 16?app?=?QtGui.QApplication(sys.argv) 17?icon?=?Icon() 18?icon.show() 19?sys.exit(app.exec_()) class?Icon(QtGui.QWidget): ??? 面向對象編程中最重要的三個要素就是類(classes),數(shù)據(jù)(data)和方法(methods)。首先我們建立一個類叫做Icon,他從QtGui.QWidget繼承而來。這就意味著,我們必須要兩次調(diào)用構造方法,一個是Icon類的,另一個是父類的。????def?__init__(self,?parent=None): ????????QtGui.QWidget.__init__(self,?parent) self.setGeometry(300,?300,?250,?150) ??? 上面三個方法都是從父類繼承而來,即QtGui.QWidget。setGeometry()在這里做兩件事情,一是指定了窗口在屏幕中的位置,二就是指定了窗口的大小。前面兩個參數(shù)是x和y坐標,后面兩個是窗口的width和height。最后一個方法給窗口指定了一個圖標,我們需要首先創(chuàng)建一個QIcon對象,而QIcon接受一個參數(shù)指明圖標的路徑。self.setWindowTitle('Icon')?????? self.setWindowIcon(QtGui.QIcon('icons/web.png')) ![]() 圖2:Icon 展示信息提示(tooltip) ??? 我們可以使用PyQt4給任何的部件添加信息提示功能。 ?1?#!/usr/bin/python ??? 在這個例子中,我們給QWidget提供了信息提示。?2? ?3?#?tooltip.py ?4? ?5?import?sys ?6?from?PyQt4?import?QtGui ?7?from?PyQt4?import?QtCore ?8? ?9?class?Tooltip(QtGui.QWidget): 10?????def?__init__(self,?parent=None): 11?????????QtGui.QWidget.__init__(self,?parent) 12? 13?????????self.setGeometry(300,?300,?250,?150) 14?????????self.setWindowTitle('Tooltip') 15? 16?????????self.setToolTip('This?is?a?<b>QWidget</b>?widget') 17?????????QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish',?10)) 18? 19?app?=?QtGui.QApplication(sys.argv) 20?tooltip?=?Tooltip() 21?tooltip.show() 22?app.exec_() self.setToolTip('This?is?a?<b>QWidget</b>?widget') ??? 使用setTooltip()來創(chuàng)建一個tooltip,值得高興的是,我們可以使用富文本格式(rich text formatting)。QtGui.QToolTip.setFont(QtGui.QFont('Courier?New',?10)) ??? 由于QToolTip默認的字體看起來很糟糕,所以我們對之進行一些改進。![]() 圖3:Tooltip 關閉窗口 ??? 之前的例子中,我們關閉程序都是使用標題欄上的X按鈕進行關閉的。下面的例子里,我們使用編程的方式來關閉窗口。而在這里,我們就要開始了解一些Qt中非常重要的概念了,信號(signals)和槽(slots)。 ??? 下面一行是QPushButton的構造方法。 QPushButton(string?text,?QWidget?parent?=?None) ??? 參數(shù)text是在按鈕上顯示的文本,parent是按鈕的父容器。?1?#!/usr/bin/python ?2? ?3?#?quitbutton.py ?4? ?5?import?sys ?6?from?PyQt4?import?QtGui,?QtCore ?7? ?8?class?QuitButton(QtGui.QWidget): ?9?????def?__init__(self,?parent=None): 10?????????QtGui.QWidget.__init__(self,?parent) 11? 12?????????self.setGeometry(300,?300,?250,?150) 13?????????self.setWindowTitle('Icon') 14? 15?????????quit?=?QtGui.QPushButton('Close',?self) 16?????????quit.setGeometry(10,?10,?60,?35) 17? 18?????????self.connect(quit,?QtCore.SIGNAL('clicked()'),?\ 19??????????????????????QtGui.qApp,?QtCore.SLOT('quit()')) 20????????? 21?app?=?QtGui.QApplication(sys.argv) 22?qb?=?QuitButton() 23?qb.show() 24?sys.exit(app.exec_()) quit?=?QtGui.QPushButton('Close',?self) ???? 在QWidget上我們創(chuàng)建了一個按鈕,就像在屏幕中創(chuàng)建一個QWidget一樣。quit.setGeometry(10,?10,?60,?35) self.connect(quit,?QtCore.SIGNAL('clicked()'),?\ ???? 正如前面所說,PyQt4的事件處理時間里在信號(signals)和槽(slots)機制上的。如果我們點擊了按鈕,就發(fā)射了信號clicked()方法。槽可以是PyQt槽,也可以是任何python中可調(diào)用的方法。通過使用QtCore.QObject.connect()方法將信號和槽鏈接起來。在我們的例子中,使用的槽是PyQt中預先定義的quit()槽。就好象sender和receiver一樣,在兩個對象之間進行交流。在上面的例子里,sender就是按鈕,receiver就是application對象。???????????? QtGui.qApp,?QtCore.SLOT('quit()')) ![]() 圖4:quit button 對話框 ??? 默認情況下,如果我們點擊了標題欄的X按鈕,就會將窗口關閉,而有些時候,需要修改這樣的行為。比如說在文本編輯器中,如個要關閉一個正在修改的文件,就會彈出一個對話框來確認。 ?1?#!/usr/bin/python ??? 如果要關閉QWidget,QCloseEvent時間就會產(chǎn)生。要修改QWidget的默認行為,就需要重載父類中的closeEvent()方法。?2? ?3?#?messagebox.py ?4? ?5?import?sys ?6?from?PyQt4?import?QtGui ?7? ?8?class?MessageBox(QtGui.QWidget): ?9?????def?__init__(self,?parent=None): 10?????????QtGui.QWidget.__init__(self,?parent) 11? 12?????????self.setGeometry(300,?300,?250,?150) 13?????????self.setWindowTitle('message?box') 14? 15?????def?closeEvent(self,?event): 16?????????reply?=?QtGui.QMessageBox.question(self,?'Message',?\ 17????????????????????????????????????????????'Are?you?sure?to?quit?',\ 18????????????????????????????????????????????QtGui.QMessageBox.Yes,?QtGui.QMessageBox.No) 19?????????if?reply?==?QtGui.QMessageBox.Yes: 20?????????????event.accept() 21?????????else: 22?????????????event.ignore() 23????????????? 24????????? 25?app?=?QtGui.QApplication(sys.argv) 26?mb?=?MessageBox() 27?mb.show() 28?sys.exit(app.exec_()) reply?=?QtGui.QMessageBox.question(self,?'Message',?\ ??? 在這里,顯示了兩個按鈕的對話框,Yes和No。第一個string參數(shù)出現(xiàn)在標題欄上,第二個string參數(shù)顯示在對話框中。在reply中保存了返回值。?????????????????????????????????? 'Are?you?sure?to?quit?',\ ???????????????????????????????????????????QtGui.QMessageBox.Yes,?QtGui.QMessageBox.No) if?reply?==?QtGui.QMessageBox.Yes: ??? 對返回值進行比較,如果點擊了Yes按鈕,就接受事件,關閉窗口,相反就忽略事件。??? event.accept() else: ??? event.ignore() ![]() 圖5:message box 窗口居中 ??? 下面的代碼展示了如何將創(chuàng)建的窗口在屏幕中居中。 ?1?#!/usr/bin/python ?2? ?3?#?center.py ?4? ?5?import?sys ?6?from?PyQt4?import?QtGui ?7? ?8?class?Center(QtGui.QWidget): ?9?????def?__init__(self,?parent=None): 10?????????QtGui.QWidget.__init__(self,?parent) 11????????? 12?????????self.setWindowTitle('center') 13?????????self.resize(250,?150) 14?????????self.center() 15? 16?????def?center(self): 17?????????screen?=?QtGui.QDesktopWidget().screenGeometry() 18?????????size?=?self.geometry() 19?????????self.move((screen.width()-size.width())/2,?(screen.height()-size.height())/2) 20????????????? 21????????? 22?app?=?QtGui.QApplication(sys.argv) 23?c?=?Center() 24?c.show() 25?sys.exit(app.exec_()) self.resize(250,?150) ??? 將窗口大小調(diào)整為寬250px,高150px。screen?=?QtGui.QDesktopWidget().screenGeometry() ??? 獲得顯示器的分辨率。size?=?self.geometry() ??? 獲得QWidget的大小。self.move((screen.width()-size.width())/2,?(screen.height()-size.height())/2) ??? 將窗口移動到屏幕中央。
|
![]() |
|
Copyright © glorywine | Powered by: 博客園 模板提供:滬江博客 |