我与PyQt5有个约会系列教程(7):状态栏,工具栏和菜单栏

QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。

1,状态栏

状态栏控件比较简单,就先从这里开始。

源代码如下 :

# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from PyQt5.QtGui import QIcon
import sys

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitUI()
        
    def InitUI(self):
        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300,300,550,300)
        self.setWindowTitle('我与PyQt5有个约会 --状态栏的实现')
        self.setWindowIcon(QIcon('myico.ico'))
        self.show()
    
    # 关闭程序窗口
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', 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_())

执行结果如下:

self.statusBar().showMessage('准备就绪')

要获取状态栏,我们调用QWidget.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。

2,菜单栏

1),创建一个简单的菜单栏。

实现简单的菜单栏的源代码如下 :

# -*- coding: utf-8 -*-

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

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitUI()
        
    def InitUI(self):
        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300,300,550,300)
        self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
        self.setWindowIcon(QIcon('myico.ico'))
        
        self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
        self.exitQAct.setShortcut('Ctrl+Q')
        self.exitQAct.setStatusTip('退出程序')
        self.exitQAct.triggered.connect(qApp.quit)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('文件(&F)')
        fileMenu.addAction(self.exitQAct)
        
        self.show()
    
    # 关闭程序窗口
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', 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_())

在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。

执行的结果如下:

self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')

QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。

self.exitQAct.triggered.connect(qApp.quit)

当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法。 这终止了应用程序。

menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.exitQAct)

menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。

上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。

2), 子菜单

子菜单是另一个菜单中的菜单。类似下图中的样子。

或者 :

子菜单实现的源代码 :

# -*- coding: utf-8 -*-

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

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitUI()
        
    def InitUI(self):
        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300,300,550,300)
        self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
        self.setWindowIcon(QIcon('myico.ico'))
        
        self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
        self.newQAct.setShortcut('Ctrl+N')
        self.newQAct.setStatusTip('新建文件')
        
        self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
        self.exitQAct.setShortcut('Ctrl+Q')
        self.exitQAct.setStatusTip('退出程序')
        self.exitQAct.triggered.connect(qApp.quit)
        
        saveMenu = QMenu('保存方式(&S)', self)
        
        self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
        self.saveQAct.setShortcut('Ctrl+S')
        self.saveQAct.setStatusTip('保存文件')
        
        self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
        self.saveasQAct.setStatusTip('文件另存为')
        
        saveMenu.addAction(self.saveQAct)
        saveMenu.addAction(self.saveasQAct)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('文件(&F)')
        fileMenu.addAction(self.newQAct)
        fileMenu.addMenu(saveMenu)
        fileMenu.addSeparator()
        fileMenu.addAction(self.exitQAct)

        self.show()
    
    # 关闭程序窗口
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', 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_())

程序效果如下:

在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。

saveMenu = QMenu('保存方式(&S)', self)

 使用QMenu创建新菜单。

self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
self.saveQAct.setShortcut('Ctrl+S')
self.saveQAct.setStatusTip('保存文件')
        
self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
self.saveasQAct.setStatusTip('文件另存为')
        
saveMenu.addAction(self.saveQAct)
saveMenu.addAction(self.saveasQAct)

两个动作使用addAction()被添加到子菜单中。

3), 上下文菜单

Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。

先欣赏一下源代码大餐 :

# -*- coding: utf-8 -*-

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

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitUI()
        
    def InitUI(self):
        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300,300,550,300)
        self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
        self.setWindowIcon(QIcon('myico.ico'))
        
        self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
        self.newQAct.setShortcut('Ctrl+N')
        self.newQAct.setStatusTip('新建文件')
        
        self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
        self.exitQAct.setShortcut('Ctrl+Q')
        self.exitQAct.setStatusTip('退出程序')
        self.exitQAct.triggered.connect(qApp.quit)
        
        saveMenu = QMenu('保存方式(&S)', self)
        
        self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
        self.saveQAct.setShortcut('Ctrl+S')
        self.saveQAct.setStatusTip('保存文件')
        
        self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
        self.saveasQAct.setStatusTip('文件另存为')
        
        saveMenu.addAction(self.saveQAct)
        saveMenu.addAction(self.saveasQAct)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('文件(&F)')
        fileMenu.addAction(self.newQAct)
        fileMenu.addMenu(saveMenu)
        fileMenu.addSeparator()
        fileMenu.addAction(self.exitQAct)

        self.show()
    
    def contextMenuEvent(self, event):

        cmenu = QMenu(self)

        self.newQAct = cmenu.addAction("新建")
        self.saveQAct = cmenu.addAction("保存")
        self.exitQAct = cmenu.addAction("退出")
        action = cmenu.exec_(self.mapToGlobal(event.pos()))
        if action == self.exitQAct:
            qApp.quit()
    
    # 关闭程序窗口
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', 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_())

程序执行后,单击右键效果如下 :

要使用上下文菜单,我们必须重新实现contextMenuEvent()方法。

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

使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。

if action == self.exitQAct:
    qApp.quit()

如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。

3,工具栏

 各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。

源代码如下:

# -*- coding: utf-8 -*-

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

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.InitUI()
        
    def InitUI(self):
        self.statusBar().showMessage('准备就绪')
        self.setGeometry(300,300,650,300)
        self.setWindowTitle('我与PyQt5有个约会 --菜单栏&工具栏的实现')
        self.setWindowIcon(QIcon('myico.ico'))
        
        #-------------------------------------------------------------------------
        # 菜单栏
        #-------------------------------------------------------------------------
        self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
        self.newQAct.setShortcut('Ctrl+N')
        self.newQAct.setStatusTip('新建文件')
        
        self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
        self.exitQAct.setShortcut('Ctrl+Q')
        self.exitQAct.setStatusTip('退出程序')
        self.exitQAct.triggered.connect(qApp.quit)
        
        saveMenu = QMenu('保存方式(&S)', self)
        
        self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
        self.saveQAct.setShortcut('Ctrl+S')
        self.saveQAct.setStatusTip('保存文件')
        
        self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
        self.saveasQAct.setStatusTip('文件另存为')
        
        saveMenu.addAction(self.saveQAct)
        saveMenu.addAction(self.saveasQAct)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('文件(&F)')
        fileMenu.addAction(self.newQAct)
        fileMenu.addMenu(saveMenu)
        fileMenu.addSeparator()
        fileMenu.addAction(self.exitQAct)
        
        #-------------------------------------------------------------------------
        # 工具栏
        #-------------------------------------------------------------------------
        toolbar = self.addToolBar('工具栏')
        toolbar.addAction(self.newQAct)
        toolbar.addAction(self.saveQAct)
        toolbar.addAction(self.saveasQAct)
        toolbar.addAction(self.exitQAct)

        self.show()
    
    def contextMenuEvent(self, event):

        cmenu = QMenu(self)

        self.newQAct = cmenu.addAction("新建")
        self.saveQAct = cmenu.addAction("保存")
        self.exitQAct = cmenu.addAction("退出")
        action = cmenu.exec_(self.mapToGlobal(event.pos()))
        if action == self.exitQAct:
            qApp.quit()
    
    # 关闭程序窗口
    def closeEvent(self, event):

        reply = QMessageBox.question(self, '确认', '确认退出吗', 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_())

程序执行效果如下:

#-------------------------------------------------------------------------
# 工具栏
#-------------------------------------------------------------------------
toolbar = self.addToolBar('工具栏')
toolbar.addAction(self.newQAct)
toolbar.addAction(self.saveQAct)
toolbar.addAction(self.saveasQAct)
toolbar.addAction(self.exitQAct)

工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值