2.PYQT中的菜單和工具欄

在這部分的PyQt5教程中,我們將創(chuàng)建菜單和工具欄仑性。菜單式位于菜單欄的一組命令操作惶楼。工具欄是應(yīng)用窗體中由按鈕和一些常規(guī)命令操作組成的組件。

QMainWindow類提供了一個應(yīng)用主窗口虏缸。默認(rèn)創(chuàng)建一個擁有狀態(tài)欄鲫懒、工具欄和菜單欄的經(jīng)典應(yīng)用窗口骨架。

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)建完成(依賴于QMainWindow組件)刽辙。
self.statusBar().showMessage('Ready') 為了得到狀態(tài)欄窥岩,我們調(diào)用了QtGui.QMainWindow類的statusBar()方法。第一次調(diào)用這個方法創(chuàng)建了一個狀態(tài)欄宰缤。隨后方法返回狀態(tài)欄對象颂翼。然后用showMessage()方法在狀態(tài)欄上顯示一些信息。

菜單欄

菜單欄是GUI應(yīng)用的常規(guī)組成部分慨灭。是位于各種菜單中的一組命令操作(Mac OS 對待菜單欄有些不同朦乏。為了獲得全平臺一致的效果,我們可以在代碼中加入一行:menubar.setNativeMenuBar(False)氧骤。

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):                    
        exitAction = QAction(QIcon('exit.png'), '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Menubar')    
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 

在上面的例子中呻疹,我們創(chuàng)建了有一個菜單項的菜單欄。這個菜單項包含一個選中后中斷應(yīng)用的動作筹陵。

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

QAction是一個用于菜單欄刽锤、工具欄或自定義快捷鍵的抽象動作行為镊尺。在上面的三行中,我們創(chuàng)建了一個有指定圖標(biāo)和文本為'Exit'的標(biāo)簽并思。另外庐氮,還為這個動作定義了一個快捷鍵。第三行創(chuàng)建一個當(dāng)我們鼠標(biāo)浮于菜單項之上就會顯示的一個狀態(tài)提示宋彼。

當(dāng)我們選中特定的動作弄砍,一個觸發(fā)信號會被發(fā)射。信號連接到QApplication組件的quit()方法输涕。這樣就中斷了應(yīng)用音婶。

exitAction.triggered.connect(qApp.quit)

menuBar()方法創(chuàng)建了一個菜單欄。我們創(chuàng)建一個file菜單莱坎,然后將退出動作添加到file菜單中桃熄。

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
工具欄

菜單可以集成所有命令,這樣我們可以在應(yīng)用中使用這些被集成的命令型奥。工具欄提供了一個快速訪問常用命令的方式

# !/usr/bin/python3

# -*- coding: utf-8 -*-
"""
This program creates a toolbar.
The toolbar has one action, which
terminates the application, if triggered.
"""
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):
        exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)
        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
子菜單

子菜單是位于另一個菜單中的菜單。

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

"""
This program creates a submenu.
"""

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

在示例中碉京,我們有兩個菜單項; 一個位于“文件”菜單中厢汹,另一個位于“文件”的“導(dǎo)入”子菜單中。

  1. 使用創(chuàng)建新菜單QMenu谐宙。
impMenu = QMenu('Import', self)
  1. 將一個動作添加到子菜單中addAction()烫葬。
impAct = QAction('Import mail', self) 
impMenu.addAction(impAct)
Context menu(彈出菜單)

上下文菜單(也稱為彈出菜單)是在某些上下文下顯示的命令列表。例如凡蜻,在Opera網(wǎng)頁瀏覽器中搭综,當(dāng)我們右鍵單擊網(wǎng)頁時,我們會得到一個上下文菜單划栓。在這里兑巾,我們可以重新加載頁面,返回或查看頁面源忠荞。如果我們右鍵單擊工具欄蒋歌,我們將獲得另一個用于管理工具欄的上下文菜單。

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

菜單可以集成所有命令委煤,這樣我們可以在應(yīng)用中使用這些被集成的命令堂油。工具欄提供了一個快速訪問常用命令的方式

#!/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)建了一個簡單的工具欄碧绞。工具欄有一個動作府框,當(dāng)這個退出動作被觸發(fā)時應(yīng)用將會被中斷。

  1. 我們創(chuàng)建了一個動作對象讥邻,和之前菜單欄中的部分代碼相似迫靖。這個動作有一個標(biāo)簽院峡,圖標(biāo)和快捷鍵。并且將QtGui.QMainWindow的quit()方法連接到了觸發(fā)信號上袜香。
exitAction = QAction(QIcon('exit24.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.triggered.connect(qApp.quit)

  1. 這里我們創(chuàng)建了一個工具欄撕予,并且在其中插入一個動作對象。
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
組合在一起
#!/usr/bin/python3
# -*- coding: utf-8 -*-

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

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)建了一個帶有菜單欄蜈首、工具欄和狀態(tài)欄的經(jīng)典GUI應(yīng)用骨架实抡。

  1. 在這里我們創(chuàng)建了一個文本編輯框組件。我們將它設(shè)置成QMainWindow的中心組件欢策。中心組件占據(jù)了所有剩下的空間吆寨。
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
mainwindow

在這個部分的PyQt5中,我們使用了菜單踩寇、工具欄啄清、狀態(tài)欄和一個應(yīng)用主窗口。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俺孙,一起剝皮案震驚了整個濱河市辣卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睛榄,老刑警劉巖荣茫,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異场靴,居然都是意外死亡啡莉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門旨剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧欣,“玉大人,你說我怎么就攤上這事轨帜∑枪荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵阵谚,是天一觀的道長蚕礼。 經(jīng)常有香客問我,道長梢什,這世上最難降的妖魔是什么奠蹬? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嗡午,結(jié)果婚禮上囤躁,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好狸演,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布言蛇。 她就那樣靜靜地躺著,像睡著了一般宵距。 火紅的嫁衣襯著肌膚如雪腊尚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天满哪,我揣著相機與錄音婿斥,去河邊找鬼。 笑死哨鸭,一個胖子當(dāng)著我的面吹牛民宿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播像鸡,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼活鹰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了只估?” 一聲冷哼從身側(cè)響起志群,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛔钙,沒想到半個月后赖舟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夸楣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了子漩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豫喧。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幢泼,靈堂內(nèi)的尸體忽然破棺而出紧显,到底是詐尸還是另有隱情,我是刑警寧澤缕棵,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布孵班,位于F島的核電站,受9級特大地震影響招驴,放射性物質(zhì)發(fā)生泄漏篙程。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一别厘、第九天 我趴在偏房一處隱蔽的房頂上張望虱饿。 院中可真熱鬧,春花似錦、人聲如沸氮发。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽冕。三九已至仇祭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颈畸,已是汗流浹背乌奇。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留承冰,地道東北人华弓。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像困乒,于是被迫代替她去往敵國和親寂屏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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