PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏

Posted yanzi1225627

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏相关的知识,希望对你有一定的参考价值。

QMainWindow

QMainWindow是继承自QWidget,提供一个应用程序的主窗口。通过QMainWindow你可以添加自己的QToolBarsQDockWidgetsQMenuBarQStatusBar等。见下图:

所以如果我们写程序的话,主窗口一般都是继承QMainWindow,这个有点类似android里的Activity的意思。接下来我们就对最下面的状态栏(StatusBar)、最上面的菜单栏(MenuBar)、以及工具栏(ToolBars)做单独的说明.

状态栏(StatusBar)

源码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication

class Example1(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        pass

    def initUI(self):
        self.statusBar().showMessage('Reday')
        self.setGeometry(300, 300, 450, 450)
        self.setWindowTitle('QMainWindow的状态栏demo')
        self.show()
        pass

def main1():
    app = QApplication(sys.argv)
    example = Example1()
    sys.exit(app.exec_())
    pass

if __name__ == '__main__':
    main1()

效果如下所示:

核心提示:通过statusBar()让QMainWindow创建一个状态栏,然后showMessage打印信息,之后再调statusBar将直接返回这个状态栏对象.

菜单栏(MenuBar)

一个应用程序可以有很多个菜单(横向的),每个菜单里有很多个Action(竖排的)。
源码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenuBar, QAction, qApp
from PyQt5.QtGui import QIcon

# 菜单栏
class Example2(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        pass

    def initUI(self):
        self.statusBar() #创建一个空的状态栏
        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        fileMenu = menubar.addMenu('File')

        #给menu创建一个Action
        exitAction = QAction(QIcon('exit.png'), 'Exit', self)
        exitAction.setShortcut('Ctr+Q')
        exitAction.setStatusTip('Exit Application')
        exitAction.triggered.connect(qApp.quit)

        #将这个Action添加到fileMenu上
        fileMenu.addAction(exitAction)

        self.setWindowTitle('QMainWindow的菜单栏的显示')
        self.setGeometry(300, 300, 450, 450)
        self.show()
        pass

def main2():
    app = QApplication(sys.argv)
    example = Example2()
    sys.exit(app.exec_())
    pass

if __name__ == '__main__':
    main2()

运行效果:

要点解释

  1. 在Mac上要加menubar.setNativeMenuBar(False),否则很可能不显示。这是因为Mac上的菜单栏不在应用程序的顶部,而是在整个桌面的顶部。加上这句话后显示的是Windows上的样式。
  2. 一个Menu必须要有一个Action才会显示,至少在Mac上是这样。
  3. Menu的关键字FileView,系统会自动给你加一些Action。
  4. Action的关键字为Exit时,同样不显示。下面是Mac上把menubar.setNativeMenuBar(False)去掉,把Action的关键字改成其他的效果.
  5. exitAction.triggered.connect(qApp.quit)的效果和exitAction.triggered.connect(QCoreApplication.instance().exit)效果是一样的,可以看qApp实际是一个宏。
  6. Action的信号是triggered, QPushButton的信号是clicked
  7. 在Mac上设置的退出快捷键好像没有效果。

工具栏ToolBar

在菜单栏里可以把所有的按钮都集中进来,但是最常用的按钮可以放在工具栏,即菜单栏的下方。

#coding=utf-8
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenuBar, QAction, qApp
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication

class Example3(QMainWindow):

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

    def initUI(self):
        exitAction = QAction(QIcon('exit.png'), '退出吧宝宝', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)

        self.toolbar = self.addToolBar('Exit123')
        self.toolbar.addAction(exitAction)
        self.toolbar.addAction(QIcon('exit.png'), '翻滚')

        self.setGeometry(300, 300, 450, 450)
        self.setWindowTitle('QMainWindow的ToolBar')
        self.show()
        pass

def main3():
    app = QApplication(sys.argv)
    example = Example3()
    sys.exit(app.exec_())
    pass

if __name__ == '__main__':
    main3()

效果如下:

要点解释

  1. 通过self.addToolBar('Exit')创建一个ToolBar,一个ToolBar可以加多个Action,默认是横向排列的。这里的Exit仅仅是标识TooBar,因为一个QMainWindow也可以有多个ToolBar。如下代码展示:
    self.toolbar = self.addToolBar('Exit123')
        self.toolbar.addAction(exitAction)
        self.toolbar.addAction(QIcon('exit.png'), '翻滚')

        self.toolbar2 = self.addToolBar('Exit456')
        self.toolbar2.addAction(exitAction)
        self.toolbar2.addAction(QIcon('exit.png'), '翻滚')

效果如下:

状态栏、工具栏、菜单栏综合练习

代码如下:

#coding=utf-8
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenuBar, QAction, qApp, QTextEdit
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication

class Example4(QMainWindow):

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

    def initUI(self):
        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)

        # 创建一个Action
        exitAction = QAction(QIcon('exit.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('退出程序')
        exitAction.triggered.connect(self.close)

        # 底部状态栏
        self.statusBar().showMessage('状态栏看我')

        # 顶部菜单栏
        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        fileMenu = menubar.addMenu('File')
        fileMenu.addAction(exitAction)

        # 次顶部的工具栏
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAction)

        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('QMainWindow综合使用')
        self.show()
        pass

def main4():
    app = QApplication(sys.argv)
    example = Example4()
    sys.exit(app.exec_())
    pass

if __name__ == '__main__':
    main4()

效果

要点提示:setStatusTip设置的东西会在底部的状态栏显示。

以上是关于PyQt5学习记录---QMainWindow菜单栏状态栏和工具栏的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5学习--基本窗口控件--QMainWindow

简单的 PyQt5 教程不显示菜单栏

PyQt5快速入门PyQt5基本窗口组件

PyQt5菜单添加+事件+状态栏-7

pyqt5,接收 AttributeError:“QMainWindow”对象没有属性“browseSlot”

pyqt5-QMenuBar