PyQt5 第二章 窗口布局管理(三)

2.3 菜单和工具栏

这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。

2.3.1 状态栏

状态栏是用来显示应用的状态信息的组件,状态栏是由QMainWindow创建的

程序展示

本例中,创建一个状态栏

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.statusBar().showMessage("正常!")

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('状态栏')
        self.show()


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

程序预览:
PyQt5 第二章 窗口布局管理(三)_第1张图片

代码解释

statusBar():创建状态栏,showMessage():在状态栏上显示一条信息

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

2.3.2 菜单栏

程序展示

本例中,创建只有一个命令的菜单栏,这个命令就是终止应用。同时也创建了一个状态栏。而且还能使用快捷键Ctrl+Q退出应用

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

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        qact = QAction(QIcon('icon.jpg'), 'exit', self)
        qact.setShortcut("ctrl+q")
        qact.setStatusTip('退出')
        qact.triggered.connect(qApp.quit)

        menu = self.menuBar()
        filemenu = menu.addMenu("file")
        filemenu.addAction(qact)

        self.statusBar()

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('菜单栏')
        self.show()


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

程序预览:
PyQt5 第二章 窗口布局管理(三)_第2张图片

代码解释

QAction是菜单栏、工具栏或者快捷键的动作的组合

创建一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作,注意:ctrl+q之间不可以有空格

qact = QAction(QIcon('icon.jpg'), 'exit', self)
qact.setShortcut("ctrl+q")

创建状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态

qact.setStatusTip('退出')

当执行exit或ctrl+q动作时,就触发了QApplicationquit()事件,终止应用

qact.triggered.connect(qApp.quit)

menuBar():创建菜单栏。这里创建了一个菜单栏,并用addMenu()在上面添加了一个file菜单,用addAction()关联了点击退出应用的事件

menu = self.menuBar()
filemenu = menu.addMenu("file")
filemenu.addAction(qact)

2.3.3 子菜单

子菜单是嵌套在菜单里面的二级或者三级菜单

程序展示

本例中,有两个子菜单,一个在File菜单下面,一个在File的Import下面

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

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 创建菜单栏,添加file菜单
        menu = self.menuBar()
        filemenu = menu.addMenu('file')

        # 添加New子菜单
        newact = QAction('new', filemenu)
        filemenu.addAction(newact)

        # 添加email子菜单
        emailmenu = QMenu('email', filemenu)
        emailmenu.addAction(QAction('163@mail', self))
        emailmenu.addAction(QAction('qq@mail', self))
        filemenu.addMenu(emailmenu)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('子菜单')
        self.show()


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

程序预览:
PyQt5 第二章 窗口布局管理(三)_第3张图片

代码解释

创建一级菜单

menu = self.menuBar()
filemenu = menu.addMenu('file')

创建名为new的二级菜单

newact = QAction('new', filemenu)
filemenu.addAction(newact)

使用QMenu创建一个email菜单,父级是filemenu

emailmenu = QMenu('email', filemenu)

使用addAction()添加动作,创建两个三级菜单

emailmenu.addAction(QAction('163@mail', self))
emailmenu.addAction(QAction('qq@mail', self))

将emailmenu添加为二级菜单

filemenu.addMenu(emailmenu)

2.3.4 勾选菜单

程序展示

本例中,创建一个勾选菜单,这个行为/动作能切换状态栏显示或者隐藏

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

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.sbar = self.statusBar()
        self.initUI()

    def initUI(self):

        self.sbar.showMessage('Ready Go')

        menu = self.menuBar()
        filemenu = menu.addMenu('file')

        qact = QAction('open', filemenu, checkable=True)
        qact.setStatusTip('open file')
        qact.setChecked(True)
        qact.triggered.connect(self.status)

        filemenu.addAction(qact)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('勾选菜单')
        self.show()

    def status(self, s):

        if s:
            self.sbar.showMessage('checked')
        else:
            self.sbar.showMessage('unchecked')


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

程序预览:

PyQt5 第二章 窗口布局管理(三)_第4张图片

checkable选项创建一个可勾选的菜单

qact = QAction('open', filemenu, checkable=True)

设置默认为选中状态

qact.setChecked(True)

绑定事件,勾选菜单时触发

qact.triggered.connect(self.status)

回调函数,勾选菜单时触发,s的值为False或True

def status(self, s):
    if s:
        self.sbar.showMessage('checked')
    else:
        self.sbar.showMessage('unchecked')

2.3.5 右键菜单

右键菜单也叫弹出框,是在某些场合下显示的一组命令

程序展示

本例中,创建右键菜单

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

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

        newact = cmenu.addAction('new')
        openact = cmenu.addAction('open')
        quitact = cmenu.addAction('quit')

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

        if quitact == act:
            qApp.quit()
            
    # 效果一样        
    # def contextMenuEvent(self, event):
    #     cmenu = QMenu()
    # 
    #     cmenu.addAction('new')
    #     cmenu.addAction('open')
    # 
    #     qact = QAction('quit', cmenu)
    #     qact.triggered.connect(qApp.quit)
    #     cmenu.addAction(qact)
    # 
    #     cmenu.exec_(self.mapToGlobal(event.pos()))


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

程序预览:
PyQt5 第二章 窗口布局管理(三)_第5张图片

代码解释

使用exec_()方法显示菜单,从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口的绝对坐标

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

如果右键菜单里点击了quit,就触发了退出事件

if action == quitAct:
    qApp.quit()

2.3.6 工具栏

程序展示

本例中,我们创建一个工具栏,并绑定退出应用的动作

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

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        qtool = QAction(QIcon('icon.jpg'), 'exit', self)
        qtool.setShortcut('ctrl+q')
        qtool.triggered.connect(qApp.quit)

        toolbar = self.addToolBar('exit')
        toolbar.addAction(qtool)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Toolbar')
        self.show()


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

程序预览:

PyQt5 第二章 窗口布局管理(三)_第6张图片

代码解释

addToolBar()创建工具栏对象,并用addAction()将动作对象添加到工具栏

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

2.3.7 主窗口

主窗口就是状态栏、工具栏和菜单栏的总称,QMainWindow提供了主窗口的功能,使用它就能创建状态栏、工具栏和菜单栏

程序展示

本例中,创建一个很经典的菜单框架,有右键菜单,工具栏和状态栏

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

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 菜单栏
        menu = self.menuBar()
        filemenu = menu.addMenu('file')

        # 工具栏
        toolbar = self.addToolBar('exit')

        # 退出动作
        quitact = QAction(QIcon('icon.jpg'), 'exit', self)
        quitact.setShortcut('ctrl+q')
        quitact.triggered.connect(self.close)

        # 添加动作
        filemenu.addAction(quitact)
        toolbar.addAction(quitact)

        # 状态栏
        self.statusBar().showMessage('ready go')

        # 文本编辑区
        text = QTextEdit()
        self.setCentralWidget(text)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('主窗口')
        self.show()


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

程序预览:

PyQt5 第二章 窗口布局管理(三)_第7张图片

代码解释

创建文本编辑区域,并把它放在QMainWindow的中间区域,这个组件会占满所有剩余的区域

textEdit = QTextEdit()
self.setCentralWidget(textEdit)

下一篇 事件和信号(一)

你可能感兴趣的:(PyQt5,PyQt5)