PySide圖形界面開發(一)


一.為什么要使用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參數有下列四個取值可選擇。

image

state參數表示哪個pixmap將被使用。

image

下面的函數是通過設置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()

運行得到:

image

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')

然后運行,將鼠標放到圖標上就可以看到提示信息了。

image

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()

運行后如圖所示:

image

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])

運行顯示如下:image

2.7 Windows樣式

未完待續,覺得好,點個贊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM