https://maicss.gitbooks.io/pyqt5/content/hello_world.html
本章學(xué)習(xí)Qt的基本功能
例1,簡(jiǎn)單的窗口
這個(gè)簡(jiǎn)單的小例子展示的是一個(gè)小窗口沼填。但是我們可以在這個(gè)小窗口上面做很多事情倦始,改變大小,最大化脆炎,最小化等,這需要很多代碼才能實(shí)現(xiàn)秒裕。這在很多應(yīng)用中很常見(jiàn),沒(méi)必要每次都要重寫(xiě)這部分代碼喇潘,Qt已經(jīng)提供了這些功能。PyQt5是一個(gè)高級(jí)的工具集合颖低,相比使用低級(jí)的工具弧烤,能省略上百行代碼。
#!/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_())
運(yùn)行上面的代碼,能展示出一個(gè)小窗口莺戒。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
這里引入了PyQt5.QtWidgets模塊,這個(gè)模塊包含了基本的組件闹究。
app = QApplication(sys.argv)
每個(gè)PyQt5應(yīng)用都必須創(chuàng)建一個(gè)應(yīng)用對(duì)象。sys.argv是一組命令行參數(shù)的列表食店。Python可以在shell里運(yùn)行渣淤,這個(gè)參數(shù)提供對(duì)腳本控制的功能。
w = QWidget()
QWidge控件是一個(gè)用戶(hù)界面的基本控件吉嫩,它提供了基本的應(yīng)用構(gòu)造器价认。默認(rèn)情況下,構(gòu)造器是沒(méi)有父級(jí)的自娩,沒(méi)有父級(jí)的構(gòu)造器被稱(chēng)為窗口(window)用踩。
w.resize(250, 150)
resize()方法能改變控件的大小,這里的意思是窗口寬250px忙迁,高150px脐彩。
w.move(300, 300)
move()是修改控件位置的的方法。它把控件放置到屏幕坐標(biāo)的(300, 300)的位置姊扔。注:屏幕坐標(biāo)系的原點(diǎn)是屏幕的左上角惠奸。
w.setWindowTitle('Simple')
我們給這個(gè)窗口添加了一個(gè)標(biāo)題,標(biāo)題在標(biāo)題欄展示(雖然這看起來(lái)是一句廢話(huà)恰梢,但是后面還有各種欄佛南,還是要注意一下,多了就蒙了)嵌言。
w.show()
show()能讓控件在桌面上顯示出來(lái)嗅回。控件在內(nèi)存里創(chuàng)建摧茴,之后才能在顯示器上顯示出來(lái)绵载。
sys.exit(app.exec_())
最后,我們進(jìn)入了應(yīng)用的主循環(huán)中蓬蝶,事件處理器這個(gè)時(shí)候開(kāi)始工作尘分。主循環(huán)從窗口上接收事件,并把事件傳入到派發(fā)到應(yīng)用控件里丸氛。當(dāng)調(diào)用exit()
方法或直接銷(xiāo)毀主控件時(shí),主循環(huán)就會(huì)結(jié)束著摔。sys.exit()
方法能確保主循環(huán)安全退出缓窜。外部環(huán)境能通知主控件怎么結(jié)束。
exec_()
之所以有個(gè)下劃線(xiàn),是因?yàn)?code>exec是一個(gè)Python的關(guān)鍵字私股。
程序預(yù)覽:
例2倡鲸,帶窗口圖標(biāo)
窗口圖標(biāo)通常是顯示在窗口的左上角峭状,標(biāo)題欄的最左邊优床。下面的例子就是怎么用PyQt5創(chuàng)建一個(gè)這樣的窗口胆敞。
在某些環(huán)境下移层,圖標(biāo)顯示不出來(lái)幽钢。如果你遇到了這個(gè)問(wèn)題匪燕,看我在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_())
前一個(gè)例子是使用的過(guò)程式編程。Python還支持面向?qū)ο?/a>的編程:
class Example(QWidget):
def __init__(self):
super().__init__()
...
面向?qū)ο缶幊套钪匾娜齻€(gè)部分是類(lèi)(class)书闸、數(shù)據(jù)和方法嫌术。我們創(chuàng)建了一個(gè)類(lèi)的調(diào)用度气,這個(gè)類(lèi)繼承自QWidget
膨报。這就意味著,我們調(diào)用了兩個(gè)構(gòu)造器弛矛,一個(gè)是這個(gè)類(lèi)本身的丈氓,一個(gè)是這個(gè)類(lèi)繼承的万俗。super()
構(gòu)造器方法返回父級(jí)的對(duì)象该编。__init__()
方法是構(gòu)造器的一個(gè)方法课竣。
self.initUI()
使用initUI()
方法創(chuàng)建一個(gè)GUI于樟。
# 自己準(zhǔn)備一個(gè)web.png
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
上面的三個(gè)方法都繼承自QWidget
類(lèi)拇囊。setGeometry()
有兩個(gè)作用:把窗口放到屏幕上并且設(shè)置窗口大小寥袭。參數(shù)分別代表屏幕坐標(biāo)的x传黄、y和窗口大小的寬膘掰、高识埋。也就是說(shuō)這個(gè)方法是resize()
和move()
的合體。最后一個(gè)方法是添加了圖標(biāo)系忙。先創(chuàng)建一個(gè)QIcon對(duì)象笨觅,然后接受一個(gè)路徑作為參數(shù)顯示圖標(biāo)见剩。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
應(yīng)用和示例的對(duì)象創(chuàng)立扫俺,主循環(huán)開(kāi)始狼纬。
程序預(yù)覽:
例3疗琉,提示框
#!/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_())
在這個(gè)例子中凑耻,我們?yōu)閼?yīng)用創(chuàng)建了一個(gè)提示框香浩。
QToolTip.setFont(QFont('SansSerif', 10))
這個(gè)靜態(tài)方法設(shè)置了提示框的字體邻吭,我們使用了10px的SansSerif字體囱晴。
self.setToolTip('This is a <b>QWidget</b> widget')
調(diào)用setTooltip()
創(chuàng)建提示框可以使用富文本格式的內(nèi)容畸写。
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
創(chuàng)建一個(gè)按鈕艺糜,并且為按鈕添加了一個(gè)提示框破停。
btn.resize(btn.sizeHint())
btn.move(50, 50)
調(diào)整按鈕大小真慢,并讓按鈕在屏幕上顯示出來(lái)理茎,sizeHint()
方法提供了一個(gè)默認(rèn)的按鈕大小。
程序預(yù)覽:
例4蚯撩,關(guān)閉窗口
關(guān)閉一個(gè)窗口最直觀(guān)的方式就是點(diǎn)擊標(biāo)題欄的那個(gè)叉胎挎,這個(gè)例子里犹菇,我們展示的是如何用程序關(guān)閉一個(gè)窗口揭芍。這里我們將接觸到一點(diǎn)single和slots的知識(shí)卸例。
本例使用的是QPushButton組件類(lèi)币厕。
QPushButton(string text, QWidget parent = None)
text
參數(shù)是想要顯示的按鈕名稱(chēng)旦装,parent
參數(shù)是放在按鈕上的組件阴绢,在我們的 例子里呻袭,這個(gè)參數(shù)是QWidget
左电。應(yīng)用中的組件都是一層一層(繼承而來(lái)的篓足?)的栈拖,在這個(gè)層里涩哟,大部分的組件都有自己的父級(jí),沒(méi)有父級(jí)的組件潜腻,是頂級(jí)的窗口蝌箍。
#!/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_())
這里創(chuàng)建了一個(gè)點(diǎn)擊之后就退出窗口的按鈕。
from PyQt5.QtCore import QCoreApplication
程序需要QtCore
對(duì)象专普。
qbtn = QPushButton('Quit', self)
創(chuàng)建一個(gè)繼承自QPushButton
的按鈕檀夹。第一個(gè)參數(shù)是按鈕的文本炸渡,第二個(gè)參數(shù)是按鈕的父級(jí)組件蚌堵,這個(gè)例子中沛婴,父級(jí)組件就是我們創(chuàng)建的繼承自Qwidget
的Example
類(lèi)泻蚊。
qbtn.clicked.connect(QCoreApplication.instance().quit)
事件傳遞系統(tǒng)在PyQt5內(nèi)建的single和slot機(jī)制里面性雄。點(diǎn)擊按鈕之后秒旋,信號(hào)會(huì)被捕捉并給出既定的反應(yīng)滩褥。QCoreApplication
包含了事件的主循環(huán)铺然,它能添加和刪除所有的事件魄健,instance()
創(chuàng)建了一個(gè)它的實(shí)例沽瘦。QCoreApplication
是在QApplication
里創(chuàng)建的析恋。 點(diǎn)擊事件和能終止進(jìn)程并退出應(yīng)用的quit函數(shù)綁定在了一起助隧。在發(fā)送者和接受者之間建立了通訊,發(fā)送者就是按鈕滓技,接受者就是應(yīng)用對(duì)象膝昆。
程序預(yù)覽:
例5,消息盒子
默認(rèn)情況下洗显,我們點(diǎn)擊標(biāo)題欄的×按鈕外潜,QWidget就會(huì)關(guān)閉。但是有時(shí)候挠唆,我們修改默認(rèn)行為处窥。比如,如果我們打開(kāi)的是一個(gè)文本編輯器玄组,并且做了一些修改滔驾,我們就會(huì)想在關(guān)閉按鈕的時(shí)候讓用戶(hù)進(jìn)一步確認(rèn)操作。
#!/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_())
如果關(guān)閉QWidget俄讹,就會(huì)產(chǎn)生一個(gè)QCloseEvent。改變控件的默認(rèn)行為,就是替換掉默認(rèn)的事件處理臣咖。
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
我們創(chuàng)建了一個(gè)消息框酣胀,上面有倆按鈕:Yes和No.第一個(gè)字符串顯示在消息框的標(biāo)題欄儒溉,第二個(gè)字符串顯示在對(duì)話(huà)框涛碑,第三個(gè)參數(shù)是消息框的倆按鈕瘫证,最后一個(gè)參數(shù)是默認(rèn)按鈕,這個(gè)按鈕是默認(rèn)選中的么抗。返回值在變量reply
里。
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
這里判斷返回值,如果點(diǎn)擊的是Yes按鈕,我們就關(guān)閉組件和應(yīng)用,否者就忽略關(guān)閉事件。
程序預(yù)覽:
例6吨枉,窗口居中
#!/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
提供了用戶(hù)的桌面信息锄奢,包括屏幕的大小。
self.center()
這個(gè)方法是調(diào)用我們下面寫(xiě)的,實(shí)現(xiàn)對(duì)話(huà)框居中的方法。
qr = self.frameGeometry()
得到了主窗口的大小。
cp = QDesktopWidget().availableGeometry().center()
獲取顯示器的分辨率,然后得到中間點(diǎn)的位置伶棒。
qr.moveCenter(cp)
然后把自己窗口的中心點(diǎn)放置到qr的中心點(diǎn)宛渐。
self.move(qr.topLeft())
然后把窗口的坐上角的坐標(biāo)設(shè)置為qr的矩形左上角的坐標(biāo)叨襟,這樣就把窗口居中了提澎。
程序預(yù)覽: