雜家雜談  
          日歷
          統(tǒng)計
          • 隨筆 - 7
          • 文章 - 1
          • 評論 - 15
          • 引用 - 0

          導航

          留言簿(2)

          隨筆分類

          隨筆檔案

          Python

          搜索

          •  

          積分與排名

          • 積分 - 25728
          • 排名 - 1515

          最新評論

          閱讀排行榜

           
          ?? 在這個部分,我們開始學習一些PyQt4的基本功能,解釋會比較詳細,就像教孩子說話一樣。

          最簡單的example

          ??? 下面的示例會非常的簡單,僅僅顯示一個小窗口,但是將來我們可以通過這個小窗口做很多事情。我們可以對它進行縮放,最大化,最小化。而這些就需要比較多的代碼了。但是開發(fā)人員已經(jīng)幫我們完成了這些功能,因為這些功能在大多場合都會使用到,所以沒有必要讓我們重復。PyQt是一個高級別的工具庫,如果使用級別相對較低的庫開發(fā)下面的功能,就非常可能需要更多的代碼了。

          ?1#!/usr/bin/python
          ?2
          ?3#?simple.py
          ?4
          ?5import?sys
          ?6from?PyQt4?import?QtGui
          ?7
          ?8app?=?QtGui.QApplication(sys.argv)
          ?9
          10widget?=?QtGui.QWidget()
          11widget.resize(250,?150)
          12widget.setWindowTitle('simple')
          13widget.show()
          14
          15sys.exit(app.exec_())

          ??? 下面對代碼進行分析
          import?sys
          from?PyQt4?import?QtGui
          ???? 這里,我們導入了必要的模塊,PyQt4的基本模塊都在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_來代替。
          Icon.png
          圖1:simple

          添加圖標

          ?? 應用程序的圖標一般就是一個在程序標題欄左上角顯示的小圖片,下面的例子我們展示如何使用PyQt4來顯示圖標,同時引入一些新的方法。
          ?1?#!/usr/bin/python
          ?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_())
          ??? 程序使用的是類似C語言的過程式風格,Python同時支持過程式和面向對象式的編程風格。需要注意的是,在使用PyQt4時,意味著面向對象編程。
          class?Icon(QtGui.QWidget):
          ????
          def?__init__(self,?parent=None):
          ????????QtGui.QWidget.
          __init__(self,?parent)
          ??? 面向對象編程中最重要的三個要素就是類(classes),數(shù)據(jù)(data)和方法(methods)。首先我們建立一個類叫做Icon,他從QtGui.QWidget繼承而來。這就意味著,我們必須要兩次調(diào)用構造方法,一個是Icon類的,另一個是父類的。
          self.setGeometry(300,?300,?250,?150)
          self.setWindowTitle(
          'Icon')?????? self.setWindowIcon(QtGui.QIcon('icons/web.png'))
          ??? 上面三個方法都是從父類繼承而來,即QtGui.QWidget。setGeometry()在這里做兩件事情,一是指定了窗口在屏幕中的位置,二就是指定了窗口的大小。前面兩個參數(shù)是x和y坐標,后面兩個是窗口的width和height。最后一個方法給窗口指定了一個圖標,我們需要首先創(chuàng)建一個QIcon對象,而QIcon接受一個參數(shù)指明圖標的路徑。
          simple.png
          圖2:Icon

          展示信息提示(tooltip)

          ??? 我們可以使用PyQt4給任何的部件添加信息提示功能。

          ?1?#!/usr/bin/python
          ?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_()
          ??? 在這個例子中,我們給QWidget提供了信息提示。
          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默認的字體看起來很糟糕,所以我們對之進行一些改進。
          Untitled.png
          圖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)
          quit.setGeometry(
          10,?10,?60,?35)
          ???? 在QWidget上我們創(chuàng)建了一個按鈕,就像在屏幕中創(chuàng)建一個QWidget一樣。
          self.connect(quit,?QtCore.SIGNAL('clicked()'),?\
          ???????????? QtGui.qApp,?QtCore.SLOT(
          'quit()'))
          ???? 正如前面所說,PyQt4的事件處理時間里在信號(signals)和槽(slots)機制上的。如果我們點擊了按鈕,就發(fā)射了信號clicked()方法。槽可以是PyQt槽,也可以是任何python中可調(diào)用的方法。通過使用QtCore.QObject.connect()方法將信號和槽鏈接起來。在我們的例子中,使用的槽是PyQt中預先定義的quit()槽。就好象sender和receiver一樣,在兩個對象之間進行交流。在上面的例子里,sender就是按鈕,receiver就是application對象。
          Picture 1.png
          圖4:quit button

          對話框


          ??? 默認情況下,如果我們點擊了標題欄的X按鈕,就會將窗口關閉,而有些時候,需要修改這樣的行為。比如說在文本編輯器中,如個要關閉一個正在修改的文件,就會彈出一個對話框來確認。
          ?1?#!/usr/bin/python
          ?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_())
          ??? 如果要關閉QWidget,QCloseEvent時間就會產(chǎn)生。要修改QWidget的默認行為,就需要重載父類中的closeEvent()方法。
          reply?=?QtGui.QMessageBox.question(self,?'Message',?\
          ??????????????????????????????????
          'Are?you?sure?to?quit?',\
          ???????????????????????????????????????????QtGui.QMessageBox.Yes,?QtGui.QMessageBox.No)
          ??? 在這里,顯示了兩個按鈕的對話框,Yes和No。第一個string參數(shù)出現(xiàn)在標題欄上,第二個string參數(shù)顯示在對話框中。在reply中保存了返回值。
          if?reply?==?QtGui.QMessageBox.Yes:
          ??? event.accept()
          else:
          ??? event.ignore()
          ??? 對返回值進行比較,如果點擊了Yes按鈕,就接受事件,關閉窗口,相反就忽略事件。
          Picture 2.png
          圖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)
          ??? 將窗口移動到屏幕中央。
          posted on 2008-06-21 23:58 glorywine 閱讀(5080) 評論(0)  編輯  收藏 所屬分類: Python
           
          Copyright © glorywine Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 原平市| 宜兰市| 永靖县| 依兰县| 甘洛县| 衢州市| 宜城市| 武胜县| 望奎县| 泰和县| 勃利县| 含山县| 宁远县| 武胜县| 修武县| 额尔古纳市| 广宁县| 信阳市| 平潭县| 太谷县| 阿合奇县| 水城县| 潜山县| 屯门区| 阜宁县| 韩城市| 浮梁县| 张掖市| 靖安县| 巫溪县| 厦门市| 监利县| 历史| 兴安盟| 缙云县| 广宁县| 万州区| 高陵县| 宣威市| 丹寨县| 名山县|