一.為什么要使用PySide?
PySide由Qt的官方團隊--Nokia Qt進行維護,集成了Qt和Python的優勢。一個PySide程序員只需要使用簡單的Python語言就能夠發揮Qt的所有功能。PySide擁有LGPL2.1版授權許可,允許進行免費/開源軟件和私有商業軟件的開發。Matplotlib,PhotoGrabber,Wing IDE,Lucas Chess,Fminer等應用程序均使用PySide開發,這證明了PySide在軟件行業的廣泛普及和使用。另外,PySide Mobility工程還允許python訪問Qt Mobile API,這對你進行移動開發是很有幫助的。現在讓我們開始學習吧!
二.從創建窗口入手
一個簡單的PySide程序示例:
1 #coding:utf-8 2 # 導入必須模塊 3 import sys 4 from PySide.QtCore import Qt 5 from PySide.QtGui import QApplication, QLabel 6 7 # 主函數 8 if __name__ == '__main__': 9 # 創建main application 10 myApp = QApplication(sys.argv) 11 # 創建Label並設置它的屬性 12 appLabel = QLabel() 13 appLabel.setText("Hello, World!!!\n Look at my first app using PySide") 14 appLabel.setAlignment(Qt.AlignCenter) 15 appLabel.setWindowTitle("My First Application") 16 appLabel.setGeometry(300, 300, 250, 175) 17 # 顯示這個Label 18 appLabel.show() 19 # 運行main application 20 myApp.exec_() 21 sys.exit()
運行后的效果如圖:
上面程序實際上就是在一個標題為“My First Application”的主窗體上添加一個label控件,在上面顯示“Hello, World!!! Look at my first app using PySide”。通過上面的例子我們可以看到在主程序中,我們創建了一個QApplication類的實例。QApplication類管理圖形用戶界面應用程序的控制流和主要設置。它包含主事件循環,在其中來自窗口系統和其它資源的所有事件被處理和調度。它也處理應用程序的初始化和結束,並且提供對話管理。它也處理絕大多數系統范圍和應用程序范圍的設置。
對於任何一個使用Qt的圖形用戶界面應用程序,都正好存在一個QApplication對象,而不論這個應用程序在同一時間內是不是有一個或多個窗口。
2.1 創建應用圖標
應用程序圖標是在應用程序左上角以及任務欄顯示的,強調應用程序設計目的的圖片,一般是72 X 72大小,PNG格式。
1 #coding:utf-8 2 import sys 3 import time 4 from PySide.QtGui import QApplication, QWidget, QIcon 5 6 #QWidget是所有用戶界面類的基類 7 class SampleWindow(QWidget): 8 #主窗口類 9 #構造函數 10 def __init__(self): 11 QWidget.__init__(self) 12 self.setWindowTitle("Sample Window") 13 #從屏幕上(300,300)位置開始(即為最左上角的點),顯示一個200*150的界面(寬200,高150) 14 self.setGeometry(300, 300, 400, 350) 15 16 def setIcon(self): 17 #設置icon 18 appIcon = QIcon("pyside_logo.png") 19 self.setWindowIcon(appIcon) 20 21 if __name__ == "__main__": 22 try: 23 myApp = QApplication(sys.argv) 24 myWindow = SampleWindow() 25 myWindow.setIcon() 26 myWindow.show() 27 myApp.exec_() 28 sys.exit(0) 29 except NameError: 30 print("NameError:", sys.exc_info()[1]) 31 except SystemExit: 32 print("Closing Window...") 33 except Exception: 34 print(sys.exc_info()[1])
在上面的代碼中我們在類中定義了一個函數來設置圖標,然后在main函數中調用。從下面的運行結果可知,圖標已經設置成功。
PySide.QtGui.QIcon類提供了一組函數可以對icon設置不同的大小和模式。QIcon包括以下幾種構造函數:
QIcon()
QIcon(engine)
QIcon(other)
QIcon(pixmap)
QIcon(filename)
第一種構造函數構造了一個空圖標。第二種形式需要PySide.QtGui.QIconEngineas作為參數。這個類為QIcon渲染器提供了一個抽象基類。每個圖標都有一個對應的引擎,負責與請求的大小,繪制圖標模式,狀態。第三形式簡單的從其它QIcon對象復制過來,這是最快的一種方法。第四種形式是從PySide.QtGui.QPixmap類構造圖標。這個類是一個離屏圖像表示,可以用作塗料設備。一個使用PySide.QtGui pixmapcan容易顯示在屏幕上。類、PySide.QtGui QLabelor兩個按鈕中的一個。QPushButtonor PySide.QtGui.QToolButton。QLabelhas象素映射屬性而QPushButton / QToolButtonhas圖標屬性。最后一種是通過給定的文件名構造一個圖標。如果文件名包含相對路徑,那它一定是相對於運行時的工作路徑。
QIcon類中的pixmap函數提供了各種模式來展現icon圖標。pixmap函數:PySide.QtGui.QIcon.pixmap(width, height[, mode=Normal[, state=Off]]),前兩個參數表示了icon的大小,mode參數有下列四個取值可選擇。
state參數表示哪個pixmap將被使用。
下面的函數是通過設置pixmap函數的mode參數來展現icon的各種模式的例子。我們將它添加到SampleWindow類中。
1 def setIconModes(self): 2 myIcon1 = QIcon('pyside_logo.png') 3 myLabel1 = QLabel('sample', self) 4 #圖標可用,並且與用戶有交互 5 pixmap1 = myIcon1.pixmap(50, 50, QIcon.Active, QIcon.On) 6 myLabel1.setPixmap(pixmap1) 7 myIcon2 = QIcon('pyside_logo.png') 8 myLabel2 = QLabel('sample', self) 9 #圖標不可用 10 pixmap2 = myIcon2.pixmap(50, 50, QIcon.Disabled, QIcon.Off) 11 myLabel2.setPixmap(pixmap2) 12 myLabel2.move(50, 0) 13 myIcon3 = QIcon('pyside_logo.png') 14 myLabel3 = QLabel('sample', self) 15 #圖標被選中 16 pixmap3 = myIcon3.pixmap(50, 50, QIcon.Selected, QIcon.On) 17 myLabel3.setPixmap(pixmap3) 18 myLabel3.move(100, 0)
然后在main函數中添加調用代碼:
myWindow.setIconModes()
運行得到:
2.2 顯示提示信息
使用PySide.QtGui.QToolTip類來顯示提示信息。QToolTip類可用設置提示信息的字體、顏色和富文本展示等等。如字體設置:
QToolTip.setFont(QFont("Decorative", 8, QFont.Bold))
將提示信息添加到控件:
myLabel1.setToolTip('Active Icon')
我們對之前的代碼作以下修改:
1 def __init__(self): 2 QWidget.__init__(self) 3 self.setWindowTitle("Icon Sample") 4 self.setGeometry(300, 300, 200, 150) 5 QToolTip.setFont(QFont("Decorative", 8, QFont.Bold)) 6 self.setToolTip('Our Main Window') 7 ... 8 def setIconModes(self): 9 ... 10 myLabel1.setPixmap(pixmap1) 11 myLabel1.setToolTip('Active Icon') 12 ... 13 myLabel2.move(50, 0) 14 myLabel2.setToolTip('Disabled Icon') 15 ... 16 myLabel3.move(100, 0) 17 myLabel3.setToolTip('Selected Icon')
然后運行,將鼠標放到圖標上就可以看到提示信息了。
2.3 增加按鈕
使用最多的按鈕是下壓按鈕或命令按鈕,典型的下壓按鈕包括OK, Apply, Cancel, Close, Yes, No和Help幾種。下壓按鈕在點擊鼠標,按快捷鍵、空格鍵等事件時就會發出一個信號,與擊鍵事件相關聯的控件在接收到信號時就會執行,這在Qt中通常被稱為槽。
除了下壓按鈕外,還包括QToolButton, QRadioButton, QCommandLinkButton和QCheckBox等其它按鈕。
QPushButton有三種實例化方式,它包含3個不同特征的構造函數:
QPushButton(parent=None) QPushButton(text, [parent=None]) QPushButton(icon, text, [parent=None])
parent參數可以是任何控件,text參數可以是任何的字符串,icon是一個有效的QIcon對象。
在下面的例子中我們增加了一個按鈕,用來實現關閉應用的功能:
def setButton(self): """增加退出按鈕""" myButton = QPushButton("Quit",self) myButton.move(50, 100) myButton.clicked.connect(myApp.quit)
在上例中,用戶可能會因為失誤點擊了按鈕而造成程序退出。所以我們在用戶點擊退出按鈕后必須要有用戶的確認才能退出程序,QMessageBox便能實現這個功能。我們創建以下函數:
1 def quitApp(self): 2 """從用戶獲取確認消息""" 3 userInfo = QMessageBox.question(self, "Confirmation","This will quit the application. Do you want to Continue?", QMessageBox.Yes | QMessageBox.No) 4 if userInfo == QMessageBox.Yes: 5 myApp.quit() 6 if userInfo == QMessageBox.No: 7 pass
修改connect函數參數:
myButton.clicked.connect(myApp.quitApp)
在main函數中調用show函數之前添加以下語句:
myWindow.setButton()
運行后如圖所示:
2.4 窗口居中
在PySide中沒有現成的方法實現窗口居中顯示,需要自己實現。首先需要獲取窗口的大小和位置,然后再獲取屏幕的中心位置,最后把窗口移到屏幕中間。
1 def center(self): 2 3 """將應用居中""" 4 5 qRect = self.frameGeometry() 6 7 centerPoint = QDesktopWidget().availableGeometry().center() 8 9 qRect.moveCenter(centerPoint) 10 11 self.move(qRect.topLeft())
frameGeometry()函數返回一個PySide.QtCore.QRect對象,包含了窗口的高度、寬度、頂點和左邊位置。QDesktopWidget().availableGeometry().center()返回屏幕的中心位置,接下來的兩行代碼實現將窗口移到屏幕中心的功能,然后在myWindow.show()之前調用這個函數。
2.5 關於對話框
關於對話框是用來顯示應用程序的開發者、版權和版本信息的。QMessageBox類提供了一個內置函數來實現這個功能。
PySide.QtGui.QMessageBox.about(parent, title, text)
下面我們在以前的代碼中添加一個關於對話框:
1 def setAboutButton(self): 2 """設置about按鈕""" 3 self.aboutButton = QPushButton("About", self) 4 self.aboutButton.move(150, 100) 5 self.aboutButton.clicked.connect(self.showAbout) 6 7 def showAbout(self): 8 """顯示About窗口""" 9 QMessageBox.about(self.aboutButton, "About PySide","First PySide Program by gh0st.")
下圖為運行結果:
QMessage類還提供了另外一個函數,PySide.QtGui.QMessageBox.aboutQt(parent[, title=""]),該函數用於顯示開發者使用的Qt版本信息。
2.6 定時器
在Qt中使用定時器需要用到PySide.QtCore.QTimer和PySide.QtCore.QDateTime類,開啟和關閉計時器的函數為QTimer.start(1000)和QTimer.stop(),計時的單位為ms。PySide.QtCore.QDateTime類提供了日歷日期和時鍾時間函數,是PySide.QtCore.QDate和PySide.QtCore.QTime類的組合。以下為一個數字時鍾示例代碼:
1 #coding:utf-8 2 3 import sys 4 from PySide.QtCore import QDateTime, QTimer, SIGNAL 5 from PySide.QtGui import QApplication, QWidget, QLCDNumber 6 7 class MyTimer(QWidget): 8 """計時器的主窗口類""" 9 def __init__(self): 10 QWidget.__init__(self) 11 self.setWindowTitle("My Digital Clock") 12 timer = QTimer(self) 13 self.connect(timer, SIGNAL("timeout()"), self.updtTime) 14 self.myTimeDisplay = QLCDNumber(self) 15 self.myTimeDisplay.setSegmentStyle(QLCDNumber.Filled) 16 self.myTimeDisplay.setDigitCount(8) 17 self.myTimeDisplay.resize(500, 150) 18 timer.start(1000) 19 20 def updtTime(self): 21 """更新當前時間""" 22 currentTime = QDateTime.currentDateTime().toString('hh:mm:ss') 23 self.myTimeDisplay.display(currentTime) 24 25 if __name__ == "__main__": 26 try: 27 myApp = QApplication(sys.argv) 28 myWindow = MyTimer() 29 myWindow.show() 30 myApp.exec_() 31 sys.exit(0) 32 except NameError: 33 print("Name Error", sys.exe_info()[1]) 34 except SystemExit: 35 print("Closing Window...") 36 except Exception: 37 print(sys.exe_info()[1])
2.7 Windows樣式
未完待續,覺得好,點個贊!