這個簡單的小例子展現的是一個小窗口。可是咱們能夠在這個小窗口上面作不少事情,改變大小,最大化,最小化等,這須要不少代碼才能實現。這在不少應用中很常見,不必每次都要重寫這部分代碼,Qt已經提供了這些功能。PyQt5是一個高級的工具集合,相比使用低級的工具,能省略上百行代碼。python
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we create a simple window in PyQt5. author: Jan Bodnar website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())
運行上面的代碼,能展現出一個小窗口。web
import sys from PyQt5.QtWidgets import QApplication, QWidget
這裏引入了PyQt5.QtWidgets模塊,這個模塊包含了基本的組件。shell
app = QApplication(sys.argv)
每一個PyQt5應用都必須建立一個應用對象。sys.argv是一組命令行參數的列表。Python能夠在shell裏運行,這個參數提供對腳本控制的功能。編程
w = QWidget()
QWidge控件是一個用戶界面的基本控件,它提供了基本的應用構造器。默認狀況下,構造器是沒有父級的,沒有父級的構造器被稱爲窗口(window)。安全
w.resize(250, 150)
resize()方法能改變控件的大小,這裏的意思是窗口寬250px,高150px。app
w.move(300, 300)
move()是修改控件位置的的方法。它把控件放置到屏幕座標的(300, 300)的位置。注:屏幕座標系的原點是屏幕的左上角。編輯器
w.setWindowTitle('Simple')
咱們給這個窗口添加了一個標題,標題在標題欄展現(雖然這看起來是一句廢話,可是後面還有各類欄,仍是要注意一下,多了就蒙了)。函數
w.show()
show()能讓控件在桌面上顯示出來。控件在內存裏建立,以後才能在顯示器上顯示出來。工具
sys.exit(app.exec_())
最後,咱們進入了應用的主循環中,事件處理器這個時候開始工做。主循環從窗口上接收事件,並把事件傳入到派發到應用控件裏。當調用exit()
方法或直接銷燬主控件時,主循環就會結束。sys.exit()
方法能確保主循環安全退出。外部環境能通知主控件怎麼結束。學習
exec_()
之因此有個下劃線,是由於exec
是一個Python的關鍵字。
程序預覽:
窗口圖標一般是顯示在窗口的左上角,標題欄的最左邊。下面的例子就是怎麼用PyQt5建立一個這樣的窗口。
在某些環境下,圖標顯示不出來。若是你遇到了這個問題,看我在Stackoverfolw的回答
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows an icon in the titlebar of the window. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png')) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
前一個例子是使用的過程式編程。Python還支持面向對象的編程:
class Example(QWidget): def __init__(self): super().__init__() ...
面向對象編程最重要的三個部分是類(class)、數據和方法。咱們建立了一個類的調用,這個類繼承自QWidget
。這就意味着,咱們調用了兩個構造器,一個是這個類自己的,一個是這個類繼承的。super()
構造器方法返回父級的對象。__init__()
方法是構造器的一個方法。
self.initUI()
使用initUI()
方法建立一個GUI。
# 本身準備一個web.png self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png'))
上面的三個方法都繼承自QWidget
類。setGeometry()
有兩個做用:把窗口放到屏幕上而且設置窗口大小。參數分別表明屏幕座標的x、y和窗口大小的寬、高。也就是說這個方法是resize()
和move()
的合體。最後一個方法是添加了圖標。先建立一個QIcon對象,而後接受一個路徑做爲參數顯示圖標。
if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
應用和示例的對象創立,主循環開始。
程序預覽:
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a tooltip on a window and a button. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt5.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Tooltips') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在這個例子中,咱們爲應用建立了一個提示框。
QToolTip.setFont(QFont('SansSerif', 10))
這個靜態方法設置了提示框的字體,咱們使用了10px的SansSerif字體。
self.setToolTip('This is a <b>QWidget</b> widget')
調用setTooltip()
建立提示框可使用富文本格式的內容。
btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
建立一個按鈕,而且爲按鈕添加了一個提示框。
btn.resize(btn.sizeHint()) btn.move(50, 50)
調整按鈕大小,並讓按鈕在屏幕上顯示出來,sizeHint()
方法提供了一個默認的按鈕大小。
程序預覽:
關閉一個窗口最直觀的方式就是點擊標題欄的那個叉,這個例子裏,咱們展現的是如何用程序關閉一個窗口。這裏咱們將接觸到一點single和slots的知識。
本例使用的是QPushButton組件類。
QPushButton(string text, QWidget parent = None)
text
參數是想要顯示的按鈕名稱,parent
參數是放在按鈕上的組件,在咱們的 例子裏,這個參數是QWidget
。應用中的組件都是一層一層(繼承而來的?)的,在這個層裏,大部分的組件都有本身的父級,沒有父級的組件,是頂級的窗口。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a quit button. When we press the button, the application terminates. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QCoreApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): qbtn = QPushButton('Quit', self) qbtn.clicked.connect(QCoreApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Quit button') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
這裏建立了一個點擊以後就退出窗口的按鈕。
from PyQt5.QtCore import QCoreApplication
程序須要QtCore
對象。
qbtn = QPushButton('Quit', self)
建立一個繼承自QPushButton
的按鈕。第一個參數是按鈕的文本,第二個參數是按鈕的父級組件,這個例子中,父級組件就是咱們建立的繼承自Qwidget
的Example
類。
qbtn.clicked.connect(QCoreApplication.instance().quit)
事件傳遞系統在PyQt5內建的single和slot機制裏面。點擊按鈕以後,信號會被捕捉並給出既定的反應。QCoreApplication
包含了事件的主循環,它能添加和刪除全部的事件,instance()
建立了一個它的實例。QCoreApplication
是在QApplication
裏建立的。 點擊事件和能終止進程並退出應用的quit函數綁定在了一塊兒。在發送者和接受者之間創建了通信,發送者就是按鈕,接受者就是應用對象。
程序預覽:
默認狀況下,咱們點擊標題欄的×按鈕,QWidget就會關閉。可是有時候,咱們修改默認行爲。好比,若是咱們打開的是一個文本編輯器,而且作了一些修改,咱們就會想在關閉按鈕的時候讓用戶進一步確認操做。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program shows a confirmation message box when we click on the close button of the application window. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
若是關閉QWidget,就會產生一個QCloseEvent。改變控件的默認行爲,就是替換掉默認的事件處理。
reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
咱們建立了一個消息框,上面有倆按鈕:Yes和No.第一個字符串顯示在消息框的標題欄,第二個字符串顯示在對話框,第三個參數是消息框的倆按鈕,最後一個參數是默認按鈕,這個按鈕是默認選中的。返回值在變量reply
裏。
if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
這裏判斷返回值,若是點擊的是Yes按鈕,咱們就關閉組件和應用,否者就忽略關閉事件。
程序預覽:
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program centers a window on the screen. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ import sys from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(250, 150) self.center() self.setWindowTitle('Center') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
QtGui.QDesktopWidget
提供了用戶的桌面信息,包括屏幕的大小。
self.center()
這個方法是調用咱們下面寫的,實現對話框居中的方法。
qr = self.frameGeometry()
獲得了主窗口的大小。
cp = QDesktopWidget().availableGeometry().center()
獲取顯示器的分辨率,而後獲得中間點的位置。
qr.moveCenter(cp)
而後把本身窗口的中心點放置到qr的中心點。
self.move(qr.topLeft())
而後把窗口的坐上角的座標設置爲qr的矩形左上角的座標,這樣就把窗口居中了。
程序預覽: