PyQt5学习总结(二)菜单和工具栏

主窗口(QMainWindow)

前面我们新建了一个Widget——class MainWidget(QWidget)并令其在屏幕上显示,而QMainWindow可以提供一个主窗口。
在QMainWindow.py可以看见,QMainWindow继承自QWidget,通过QMainWindow你可以添加自己的QToolBars、QDockWidgets、QMenuBar、QStatusBar等。(可以在QMainWindow.py查看该类提供的方法。)
在这里插入图片描述
新建main_window.py并编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第1张图片

状态栏(statusBar)

状态栏是用来显示应用的状态信息的组件。

在main_window.py中编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):
    	# statusBar--状态栏
    	self.statusBar().showMessage('Ready')
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第2张图片

菜单栏(menuBar)

一个应用程序可以有多个Menu(横向),每个菜单里可以有多个Action(纵向)。
在main_window.py中编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):

        self.init_menu()

        self.statusBar().showMessage('Ready')
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

    def init_menu(self):

		# 命令属性设置
        exit_act = QAction(QIcon('exit.png'), '&Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Quit PyQt5')
        # 点击时触发QApplication的quit()行为退出应用
        exit_act.triggered.connect(qApp.quit)
		# 新建菜单栏
        menu_bar = self.menuBar()
		# 新增一个菜单
        file_menu = menu_bar.addMenu('&File')
        # 在菜单下新增命令
        file_menu.addAction(exit_act)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

QAction是菜单栏、工具栏或者快捷键的动作的组合。这里创建了一个终止应用的命令,鼠标悬停在Exit的时候状态栏显示相应的状态提示。
运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第3张图片

子菜单

子菜单是嵌套在菜单里面的二级或者三级等的菜单。
在main_window.py中编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):

        self.init_menu()

        self.statusBar().showMessage('Ready')
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

    def init_menu(self):

        exit_act = QAction(QIcon('exit.png'), '&Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Quit PyQt5')
        exit_act.triggered.connect(qApp.quit)

        new_act = QAction('&New Project...', self)
        new_act.setShortcut('Ctrl+N')
        new_act.setStatusTip('Create a New Project')

		# 二级菜单下命令属性设置
        open_file = QAction('&Open File...', self)
        open_file.setStatusTip('Open a file in PyQt5')
        open_project = QAction('&Open Project...', self)
        open_project.setStatusTip('Open a project in PyQt5')
		
		# 新增二级菜单
        open_menu = QMenu('&Open...', self)
        open_menu.addAction(open_file)
        open_menu.addAction(open_project)

        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        file_menu.addAction(new_act)
        # 这里使用了addMenu()
        file_menu.addMenu(open_menu)
        file_menu.addAction(exit_act)

        tool_menu = menu_bar.addMenu('Tools')


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第4张图片

右键菜单

在界面点击鼠标右键,出现弹出框菜单。
在main_window.py中编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):

        self.statusBar().showMessage('Ready')
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

    def contextMenuEvent(self, event):
    	"""重定义右键函数"""

        ri_menu = QMenu(self)

        new_act = ri_menu.addAction("New")
        opn_act = ri_menu.addAction("Open")
        quit_act = ri_menu.addAction("Quit")
        # mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标
        # exec_()为QMenu提供的方法,用于显示菜单
        action = ri_menu.exec_(self.mapToGlobal(event.pos()))

		# 如果右键菜单里触发了退出事件,执行关闭程序行为
        if action == quit_act:
            qApp.quit()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如下:
PyQt5学习总结(二)菜单和工具栏_第5张图片

工具栏(ToolBar)

菜单栏包含了所有的命令,工具栏是其中常用的命令的集合。
在main_window.py中编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):

        self.statusBar().showMessage('Ready')
        # 设置工具图标
        exit_act = QAction(QIcon('C://exit.png'), 'Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Quit PyQt5')
        exit_act.triggered.connect(qApp.quit)

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

        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第6张图片

总结

将以上所有部件结合起来,编辑代码如下:

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


class MainWidget(QMainWindow):

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

    def init_ui(self):

        self.init_menu()
        self.init_tool()

        self.statusBar().showMessage('Ready')
        self.setGeometry(500, 100, 500, 500)
        self.setWindowTitle('PyQt5')
        self.show()

    def init_menu(self):

        exit_act = QAction(QIcon('exit.png'), '&Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Quit PyQt5')
        exit_act.triggered.connect(qApp.quit)

        new_act = QAction(QIcon('new.png'), '&New Project...', self)
        new_act.setShortcut('Ctrl+N')
        new_act.setStatusTip('Create a New Project')

        open_file = QAction('&Open File...', self)
        open_file.setStatusTip('Open a file in PyQt5')
        open_project = QAction('&Open Project...', self)
        open_project.setStatusTip('Open a project in PyQt5')

        open_menu = QMenu('&Open...', self)
        open_menu.addAction(open_file)
        open_menu.addAction(open_project)

        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu('&File')
        file_menu.addAction(new_act)
        file_menu.addMenu(open_menu)
        file_menu.addAction(exit_act)

        tool_menu = menu_bar.addMenu('Tools')

    def init_tool(self):

        exit_act = QAction(QIcon('C://exit.png'), 'Exit', self)
        exit_act.setShortcut('Ctrl+Q')
        exit_act.setStatusTip('Quit PyQt5')
        exit_act.triggered.connect(qApp.quit)

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

    def contextMenuEvent(self, event):
        """重定义右键函数"""
        ri_menu = QMenu(self)

        new_act = ri_menu.addAction("New")
        opn_act = ri_menu.addAction("Open")
        quit_act = ri_menu.addAction("Quit")
        # mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标
        # exec_()为QMenu提供的方法,用于显示菜单
        action = ri_menu.exec_(self.mapToGlobal(event.pos()))

        # 如果右键菜单里触发了退出事件,执行关闭程序行为
        if action == quit_act:
            qApp.quit()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainWidget()
    sys.exit(app.exec())

运行效果如图:
PyQt5学习总结(二)菜单和工具栏_第7张图片

你可能感兴趣的:(Python)