pyqt5——菜單和工具欄

菜單和工具欄

這個(gè)章節(jié)言缤,我們會(huì)創(chuàng)建狀態(tài)欄、菜單和工具欄导而。菜單是一組位于菜單欄的命令忱叭。工具欄是應(yīng)用的一些常用工具按鈕。狀態(tài)欄顯示一些狀態(tài)信息今艺,通常在應(yīng)用的底部韵丑。

主窗口

QMainWindow提供了主窗口的功能,使用它能創(chuàng)建一些簡(jiǎn)單的狀態(tài)欄虚缎、工具欄和菜單欄撵彻。

主窗口是下面這些窗口的合稱,所以教程在最下方实牡。

狀態(tài)欄

狀態(tài)欄是用來(lái)顯示應(yīng)用的狀態(tài)信息的組件千康。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a statusbar.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication


class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):               
        
        self.statusBar().showMessage('Ready')
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')    
        self.show()


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

狀態(tài)欄是由QMainWindow創(chuàng)建的。

self.statusBar().showMessage('Ready')

調(diào)用QtGui.QMainWindow類的statusBar()方法铲掐,創(chuàng)建狀態(tài)欄。第一次調(diào)用創(chuàng)建一個(gè)狀態(tài)欄值桩,返回一個(gè)狀態(tài)欄對(duì)象摆霉。showMessage()方法在狀態(tài)欄上顯示一條信息。

程序預(yù)覽:

image

菜單欄

菜單欄是非常常用的奔坟。是一組命令的集合(Mac OS下?tīng)顟B(tài)欄的顯示不一樣携栋,為了得到最相似的外觀,我們?cè)黾恿艘痪?code>menubar.setNativeMenuBar(False))咳秉。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 
學(xué)習(xí)交流:923414804
This program creates a menubar. The
menubar has one menu with an exit action.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: January 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):               
        
        exitAct = QAction(QIcon('exit.png'), '&Exit', self)        
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Simple menu')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

我們創(chuàng)建了只有一個(gè)命令的菜單欄婉支,這個(gè)命令就是終止應(yīng)用。同時(shí)也創(chuàng)建了一個(gè)狀態(tài)欄澜建。而且還能使用快捷鍵Ctrl+Q退出應(yīng)用向挖。

exitAct = QAction(QIcon('exit.png'), '&Exit', self)        
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')

QAction是菜單欄、工具欄或者快捷鍵的動(dòng)作的組合炕舵。前面兩行何之,我們創(chuàng)建了一個(gè)圖標(biāo)、一個(gè)exit的標(biāo)簽和一個(gè)快捷鍵組合咽筋,都執(zhí)行了一個(gè)動(dòng)作溶推。第三行,創(chuàng)建了一個(gè)狀態(tài)欄,當(dāng)鼠標(biāo)懸停在菜單欄的時(shí)候蒜危,能顯示當(dāng)前狀態(tài)虱痕。

exitAct.triggered.connect(qApp.quit)

當(dāng)執(zhí)行這個(gè)指定的動(dòng)作時(shí),就觸發(fā)了一個(gè)事件辐赞。這個(gè)事件跟QApplication的quit()行為相關(guān)聯(lián)部翘,所以這個(gè)動(dòng)作就能終止這個(gè)應(yīng)用。

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)

menuBar()創(chuàng)建菜單欄占拍。這里創(chuàng)建了一個(gè)菜單欄略就,并在上面添加了一個(gè)file菜單,并關(guān)聯(lián)了點(diǎn)擊退出應(yīng)用的事件晃酒。

程序預(yù)覽:

image

子菜單

子菜單是嵌套在菜單里面的二級(jí)或者三級(jí)等的菜單表牢。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a submenu.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):         
        
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        
        impMenu = QMenu('Import', self)
        impAct = QAction('Import mail', self) 
        impMenu.addAction(impAct)
        
        newAct = QAction('New', self)        
        
        fileMenu.addAction(newAct)
        fileMenu.addMenu(impMenu)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Submenu')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

這個(gè)例子里,有兩個(gè)子菜單贝次,一個(gè)在file菜單下面崔兴,一個(gè)在file的import下面。

impMenu = QMenu('Import', self)

使用QMenu創(chuàng)建一個(gè)新菜單蛔翅。

impAct = QAction('Import mail', self) 
impMenu.addAction(impAct)

使用addAction添加一個(gè)動(dòng)作敲茄。

程序預(yù)覽:


image

勾選菜單

下面是一個(gè)能勾選菜單的例子

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a checkable menu.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):         
        
        self.statusbar = self.statusBar()
        self.statusbar.showMessage('Ready')
        
        menubar = self.menuBar()
        viewMenu = menubar.addMenu('View')
        
        viewStatAct = QAction('View statusbar', self, checkable=True)
        viewStatAct.setStatusTip('View statusbar')
        viewStatAct.setChecked(True)
        viewStatAct.triggered.connect(self.toggleMenu)
        
        viewMenu.addAction(viewStatAct)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Check menu')    
        self.show()
        
    def toggleMenu(self, state):
        
        if state:
            self.statusbar.show()
        else:
            self.statusbar.hide()
       
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

本例創(chuàng)建了一個(gè)行為菜單。這個(gè)行為/動(dòng)作能切換狀態(tài)欄顯示或者隱藏山析。

viewStatAct = QAction('View statusbar', self, checkable=True)

checkable選項(xiàng)創(chuàng)建一個(gè)能選中的菜單堰燎。

viewStatAct.setChecked(True)

默認(rèn)設(shè)置為選中狀態(tài)。

def toggleMenu(self, state):
    
    if state:
        self.statusbar.show()
    else:
        self.statusbar.hide()

依據(jù)選中狀態(tài)切換狀態(tài)欄的顯示與否笋轨。
程序預(yù)覽:

image

右鍵菜單

右鍵菜單也叫彈出框(8鸭簟?)爵政,是在某些場(chǎng)合下顯示的一組命令仅讽。例如,Opera瀏覽器里钾挟,網(wǎng)頁(yè)上的右鍵菜單里會(huì)有刷新洁灵,返回或者查看頁(yè)面源代碼。如果在工具欄上右鍵掺出,會(huì)得到一個(gè)不同的用來(lái)管理工具欄的菜單徽千。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a context menu.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):         
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Context menu')    
        self.show()
    
    
    def contextMenuEvent(self, event):
       
           cmenu = QMenu(self)
           
           newAct = cmenu.addAction("New")
           opnAct = cmenu.addAction("Open")
           quitAct = cmenu.addAction("Quit")
           action = cmenu.exec_(self.mapToGlobal(event.pos()))
           
           if action == quitAct:
               qApp.quit()
       
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

還是使用contextMenuEvent()方法實(shí)現(xiàn)這個(gè)菜單。

action = cmenu.exec_(self.mapToGlobal(event.pos()))

使用exec_()方法顯示菜單蛛砰。從鼠標(biāo)右鍵事件對(duì)象中獲得當(dāng)前坐標(biāo)罐栈。mapToGlobal()方法把當(dāng)前組件的相對(duì)坐標(biāo)轉(zhuǎn)換為窗口(window)的絕對(duì)坐標(biāo)。

if action == quitAct:
    qApp.quit()

如果右鍵菜單里觸發(fā)了事件泥畅,也就觸發(fā)了退出事件荠诬,執(zhí)行關(guān)閉菜單行為琅翻。

程序預(yù)覽:


image

工具欄

菜單欄包含了所有的命令,工具欄就是常用的命令的集合柑贞。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a toolbar.
The toolbar has one action, which
terminates the application, if triggered.

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
from PyQt5.QtGui import QIcon

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):               
        
        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)
        
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAct)
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面的例子中方椎,我們創(chuàng)建了一個(gè)工具欄。這個(gè)工具欄只有一個(gè)退出應(yīng)用的動(dòng)作钧嘶。

exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)

和上面的菜單欄差不多棠众,這里使用了一個(gè)行為對(duì)象,這個(gè)對(duì)象綁定了一個(gè)標(biāo)簽有决,一個(gè)圖標(biāo)和一個(gè)快捷鍵闸拿。這些行為被觸發(fā)的時(shí)候,會(huì)調(diào)用QtGui.QMainWindow的quit方法退出應(yīng)用书幕。

self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)

把工具欄展示出來(lái)新荤。

程序預(yù)覽:


image

主窗口

主窗口就是上面三種欄目的總稱,現(xiàn)在我們把上面的三種欄在一個(gè)應(yīng)用里展示出來(lái)台汇。

首先要自己弄個(gè)小圖標(biāo)苛骨,命名為exit24.png

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program creates a skeleton of
a classic GUI application with a menubar,
toolbar, statusbar, and a central widget. 

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon


class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):               
        
        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)

        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(self.close)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAct)
        
        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

上面的代碼創(chuàng)建了一個(gè)很經(jīng)典的菜單框架,有右鍵菜單苟呐,工具欄和狀態(tài)欄痒芝。

textEdit = QTextEdit()
self.setCentralWidget(textEdit)

這里創(chuàng)建了一個(gè)文本編輯區(qū)域,并把它放在QMainWindow的中間區(qū)域牵素。這個(gè)組件或占滿所有剩余的區(qū)域严衬。

程序預(yù)覽:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市笆呆,隨后出現(xiàn)的幾起案子瞳步,更是在濱河造成了極大的恐慌,老刑警劉巖腰奋,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抱怔,居然都是意外死亡劣坊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門屈留,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)局冰,“玉大人,你說(shuō)我怎么就攤上這事灌危】刀” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵勇蝙,是天一觀的道長(zhǎng)沫勿。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么产雹? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任诫惭,我火速辦了婚禮,結(jié)果婚禮上蔓挖,老公的妹妹穿的比我還像新娘夕土。我一直安慰自己,他們只是感情好瘟判,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布怨绣。 她就那樣靜靜地躺著,像睡著了一般拷获。 火紅的嫁衣襯著肌膚如雪篮撑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天刀诬,我揣著相機(jī)與錄音咽扇,去河邊找鬼。 笑死陕壹,一個(gè)胖子當(dāng)著我的面吹牛质欲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠馆,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘶伟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了又碌?” 一聲冷哼從身側(cè)響起九昧,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毕匀,沒(méi)想到半個(gè)月后铸鹰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皂岔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蹋笼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躁垛。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剖毯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出教馆,到底是詐尸還是另有隱情逊谋,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布土铺,位于F島的核電站胶滋,受9級(jí)特大地震影響板鬓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镀钓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一穗熬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丁溅,春花似錦唤蔗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涯穷,卻和暖如春棍掐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拷况。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工作煌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赚瘦。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓粟誓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親起意。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹰服,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • Windows 常用消息大全 表A-1 Windows消息分布 消息范圍說(shuō) 明 0 ~ WM_USER – 1系統(tǒng)...
    北風(fēng)知我意閱讀 2,021評(píng)論 0 0
  • 3.1. 介紹 現(xiàn)在,您已經(jīng)安裝了Wireshark并有可能熱衷于開(kāi)始捕捉您的第一個(gè)數(shù)據(jù)包揽咕。在接下來(lái)的章節(jié)中悲酷,我們...
    wwyyzz閱讀 1,379評(píng)論 0 1
  • 路燈打亂順序列在樓宇間小山的心臟我在長(zhǎng)椅上獨(dú)坐聽(tīng)柴科夫斯基第一號(hào)鋼琴協(xié)奏曲第一樂(lè)章聽(tīng)村上春樹(shù)講故事聽(tīng)路過(guò)的腳步一個(gè)...
    小者閱讀 152評(píng)論 0 2
  • ?這是奇小娜每天一篇原創(chuàng)文章的第99天 今天是國(guó)慶假期第5天设易,我們家人的假期旅行一般比較隨性,沒(méi)有特殊的計(jì)劃和安排...
    奇小娜閱讀 495評(píng)論 0 50
  • 《好好學(xué)習(xí)》 680字 公司管理中的影響力原理應(yīng)用分析 《影響力》中提到了6個(gè)方法蛹头,可以用來(lái)讓自己的意見(jiàn)更有效的影...
    我是銀璃閱讀 178評(píng)論 0 0