PYQT5——hello world!

本章學(xué)習(xí)Qt的基本功能

例1轻绞,簡單的窗口

這個簡單的小例子展示的是一個小窗口采记。但是我們可以在這個小窗口上面做很多事情,改變大小政勃,最大化唧龄,最小化等,這需要很多代碼才能實現(xiàn)奸远。這在很多應(yīng)用中很常見选侨,沒必要每次都要重寫這部分代碼,Qt已經(jīng)提供了這些功能然走。PyQt5是一個高級的工具集合,相比使用低級的工具戏挡,能省略上百行代碼芍瑞。

#!/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_())

運行上面的代碼,能展示出一個小窗口褐墅。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

這里引入了PyQt5.QtWidgets模塊拆檬,這個模塊包含了基本的組件。

app = QApplication(sys.argv)

每個PyQt5應(yīng)用都必須創(chuàng)建一個應(yīng)用對象妥凳。sys.argv是一組命令行參數(shù)的列表竟贯。Python可以在shell里運行,這個參數(shù)提供對腳本控制的功能逝钥。

w = QWidget()

QWidge控件是一個用戶界面的基本控件屑那,它提供了基本的應(yīng)用構(gòu)造器。默認情況下艘款,構(gòu)造器是沒有父級的持际,沒有父級的構(gòu)造器被稱為窗口(window)。

w.resize(250, 150)

resize()方法能改變控件的大小哗咆,這里的意思是窗口寬250px蜘欲,高150px。

w.move(300, 300)

move()是修改控件位置的的方法晌柬。它把控件放置到屏幕坐標(biāo)的(300, 300)的位置姥份。注:屏幕坐標(biāo)系的原點是屏幕的左上角郭脂。

w.setWindowTitle('Simple')

我們給這個窗口添加了一個標(biāo)題,標(biāo)題在標(biāo)題欄展示(雖然這看起來是一句廢話澈歉,但是后面還有各種欄展鸡,還是要注意一下,多了就蒙了)闷祥。

w.show()

show()能讓控件在桌面上顯示出來娱颊。控件在內(nèi)存里創(chuàng)建凯砍,之后才能在顯示器上顯示出來箱硕。

sys.exit(app.exec_())

最后,我們進入了應(yīng)用的主循環(huán)中悟衩,事件處理器這個時候開始工作剧罩。主循環(huán)從窗口上接收事件,并把事件傳入到派發(fā)到應(yīng)用控件里座泳。當(dāng)調(diào)用exit()方法或直接銷毀主控件時惠昔,主循環(huán)就會結(jié)束。sys.exit()方法能確保主循環(huán)安全退出挑势。外部環(huán)境能通知主控件怎么結(jié)束镇防。

exec_()之所以有個下劃線,是因為exec是一個Python的關(guān)鍵字潮饱。

程序預(yù)覽:


image

例2来氧,帶窗口圖標(biāo)

窗口圖標(biāo)通常是顯示在窗口的左上角,標(biāo)題欄的最左邊香拉。下面的例子就是怎么用PyQt5創(chuàng)建一個這樣的窗口啦扬。

在某些環(huán)境下,圖標(biāo)顯示不出來凫碌。如果你遇到了這個問題扑毡,看我在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還支持面向?qū)ο?/a>的編程:

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        ...

面向?qū)ο缶幊套钪匾娜齻€部分是類(class)盛险、數(shù)據(jù)和方法瞄摊。我們創(chuàng)建了一個類的調(diào)用,這個類繼承自QWidget苦掘。這就意味著泉褐,我們調(diào)用了兩個構(gòu)造器,一個是這個類本身的鸟蜡,一個是這個類繼承的膜赃。super()構(gòu)造器方法返回父級的對象。__init__()方法是構(gòu)造器的一個方法揉忘。

self.initUI() 

使用initUI()方法創(chuàng)建一個GUI跳座。

# 自己準(zhǔn)備一個web.png
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  

上面的三個方法都繼承自QWidget類端铛。setGeometry()有兩個作用:把窗口放到屏幕上并且設(shè)置窗口大小。參數(shù)分別代表屏幕坐標(biāo)的x疲眷、y和窗口大小的寬禾蚕、高。也就是說這個方法是resize()move()的合體狂丝。最后一個方法是添加了圖標(biāo)换淆。先創(chuàng)建一個QIcon對象,然后接受一個路徑作為參數(shù)顯示圖標(biāo)几颜。

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

應(yīng)用和示例的對象創(chuàng)立倍试,主循環(huán)開始。

程序預(yù)覽:

icon

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

在這個例子中县习,我們?yōu)閼?yīng)用創(chuàng)建了一個提示框。

QToolTip.setFont(QFont('SansSerif', 10))

這個靜態(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)建一個按鈕沪蓬,并且為按鈕添加了一個提示框彤钟。

btn.resize(btn.sizeHint())
btn.move(50, 50)

調(diào)整按鈕大小,并讓按鈕在屏幕上顯示出來跷叉,sizeHint()方法提供了一個默認的按鈕大小逸雹。

程序預(yù)覽:

image

例4,關(guān)閉窗口

關(guān)閉一個窗口最直觀的方式就是點擊標(biāo)題欄的那個叉性芬,這個例子里,我們展示的是如何用程序關(guān)閉一個窗口剧防。這里我們將接觸到一點single和slots的知識植锉。

本例使用的是QPushButton組件類。

QPushButton(string text, QWidget parent = None)

text參數(shù)是想要顯示的按鈕名稱峭拘,parent參數(shù)是放在按鈕上的組件俊庇,在我們的 例子里,這個參數(shù)是QWidget鸡挠。應(yīng)用中的組件都是一層一層(繼承而來的辉饱?)的,在這個層里拣展,大部分的組件都有自己的父級彭沼,沒有父級的組件,是頂級的窗口备埃。

#!/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)建了一個點擊之后就退出窗口的按鈕姓惑。

from PyQt5.QtCore import QCoreApplication

程序需要QtCore對象褐奴。

qbtn = QPushButton('Quit', self)

創(chuàng)建一個繼承自QPushButton的按鈕。第一個參數(shù)是按鈕的文本于毙,第二個參數(shù)是按鈕的父級組件敦冬,這個例子中,父級組件就是我們創(chuàng)建的繼承自QwidgetExample類唯沮。

qbtn.clicked.connect(QCoreApplication.instance().quit)

事件傳遞系統(tǒng)在PyQt5內(nèi)建的single和slot機制里面脖旱。點擊按鈕之后,信號會被捕捉并給出既定的反應(yīng)介蛉。QCoreApplication包含了事件的主循環(huán)萌庆,它能添加和刪除所有的事件,instance()創(chuàng)建了一個它的實例甘耿。QCoreApplication是在QApplication里創(chuàng)建的踊兜。 點擊事件和能終止進程并退出應(yīng)用的quit函數(shù)綁定在了一起。在發(fā)送者和接受者之間建立了通訊佳恬,發(fā)送者就是按鈕捏境,接受者就是應(yīng)用對象。

程序預(yù)覽:

image

例5毁葱,消息盒子

默認情況下垫言,我們點擊標(biāo)題欄的×按鈕,QWidget就會關(guān)閉倾剿。但是有時候筷频,我們修改默認行為。比如前痘,如果我們打開的是一個文本編輯器凛捏,并且做了一些修改,我們就會想在關(guā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坯癣,就會產(chǎn)生一個QCloseEvent锈颗。改變控件的默認行為捧毛,就是替換掉默認的事件處理。

reply = QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)

我們創(chuàng)建了一個消息框陨晶,上面有倆按鈕:Yes和No.第一個字符串顯示在消息框的標(biāo)題欄芝硬,第二個字符串顯示在對話框蚜点,第三個參數(shù)是消息框的倆按鈕,最后一個參數(shù)是默認按鈕拌阴,這個按鈕是默認選中的绍绘。返回值在變量reply里。

if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

這里判斷返回值,如果點擊的是Yes按鈕脯倒,我們就關(guān)閉組件和應(yīng)用实辑,否者就忽略關(guān)閉事件。

程序預(yù)覽:

image

例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提供了用戶的桌面信息剪撬,包括屏幕的大小。

self.center()

這個方法是調(diào)用我們下面寫的悠反,實現(xiàn)對話框居中的方法残黑。

qr = self.frameGeometry()

得到了主窗口的大小。

cp = QDesktopWidget().availableGeometry().center()

獲取顯示器的分辨率斋否,然后得到中間點的位置梨水。

qr.moveCenter(cp)

然后把自己窗口的中心點放置到qr的中心點。

self.move(qr.topLeft())

然后把窗口的坐上角的坐標(biāo)設(shè)置為qr的矩形左上角的坐標(biāo)茵臭,這樣就把窗口居中了疫诽。

程序預(yù)覽:

image
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旦委,隨后出現(xiàn)的幾起案子奇徒,更是在濱河造成了極大的恐慌,老刑警劉巖缨硝,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摩钙,死亡現(xiàn)場離奇詭異,居然都是意外死亡查辩,警方通過查閱死者的電腦和手機胖笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宜岛,“玉大人长踊,你說我怎么就攤上這事∑汲” “怎么了身弊?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遣铝。 經(jīng)常有香客問我佑刷,道長莉擒,這世上最難降的妖魔是什么酿炸? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮涨冀,結(jié)果婚禮上填硕,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好扁眯,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布壮莹。 她就那樣靜靜地躺著,像睡著了一般姻檀。 火紅的嫁衣襯著肌膚如雪命满。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天绣版,我揣著相機與錄音胶台,去河邊找鬼。 笑死杂抽,一個胖子當(dāng)著我的面吹牛诈唬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缩麸,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铸磅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杭朱?” 一聲冷哼從身側(cè)響起阅仔,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痕檬,沒想到半個月后霎槐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡梦谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年丘跌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唁桩。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闭树,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荒澡,到底是詐尸還是另有隱情报辱,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布单山,位于F島的核電站碍现,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏米奸。R本人自食惡果不足惜昼接,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悴晰。 院中可真熱鬧慢睡,春花似錦逐工、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至髓涯,卻和暖如春袒啼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纬纪。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工瘤泪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人育八。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓对途,卻偏偏與公主長得像,于是被迫代替她去往敵國和親髓棋。 傳聞我的和親對象是個殘疾皇子实檀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容