PyQt5中的菜单和工具栏
在这部分的PyQt5教程中,我们将创建菜单和工具栏。菜单式位于菜单栏的一组命令操作。工具栏是应用窗体中由按钮和一些常规命令操作组成的组件。
主窗口
QMainWindow类提供了一个应用主窗口。默认创建一个拥有状态栏、工具栏和菜单栏的经典应用窗口骨架。
状态栏
状态栏是用来显示状态信息的组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a statusbar. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ 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_()) |
状态栏又QMainWindow组件帮助创建完成(依赖于QMainWindow组件)。
self.statusBar().showMessage('Ready')
为了得到状态栏,我们调用了QtGui.QMainWindow
类的statusBar()方法。第一次调用这个方法创建了一个状态栏。随后方法返回状态栏对象。然后用showMessage()方法在状态栏上显示一些信息。
菜单栏
菜单栏是GUI应用的常规组成部分。是位于各种菜单中的一组命令操作(Mac OS 对待菜单栏有些不同。为了获得全平台一致的效果,我们可以在代码中加入一行:menubar.setNativeMenuBar(False)
)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a menubar. The menubar has one menu with an exit action. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ 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_()) |
在上面的例子中,我们创建了有一个菜单项的菜单栏。这个菜单项包含一个选中后中断应用的动作。
1 2 3 | exitAction = QAction(QIcon( 'exit.png' ), '&Exit' , self ) exitAction.setShortcut( 'Ctrl+Q' ) exitAction.setStatusTip( 'Exit application' ) |
QAction是一个用于菜单栏、工具栏或自定义快捷键的抽象动作行为。在上面的三行中,我们创建了一个有指定图标和文本为'Exit'的标签。另外,还为这个动作定义了一个快捷键。第三行创建一个当我们鼠标浮于菜单项之上就会显示的一个状态提示。
1 | exitAction.triggered.connect(qApp.quit) |
当我们选中特定的动作,一个触发信号会被发射。信号连接到QApplication组件的quit()方法。这样就中断了应用。
1 2 3 | menubar = self .menuBar() fileMenu = menubar.addMenu( '&File' ) fileMenu.addAction(exitAction) |
menuBar()方法创建了一个菜单栏。我们创建一个file菜单,然后将退出动作添加到file菜单中。
工具栏
菜单可以集成所有命令,这样我们可以在应用中使用这些被集成的命令。工具栏提供了一个快速访问常用命令的方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/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: January 2015 """ 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_()) |
上述例子中,我们创建了一个简单的工具栏。工具栏有一个动作,当这个退出动作被触发时应用将会被中断。
1 2 3 | exitAction = QAction(QIcon( 'exit24.png' ), 'Exit' , self ) exitAction.setShortcut( 'Ctrl+Q' ) exitAction.triggered.connect(qApp.quit) |
我们创建了一个动作对象,和之前菜单栏中的部分代码相似。这个动作有一个标签,图标和快捷键。并且将QtGui.QMainWindow的
quit()方法连接到了触发信号上。
1 2 | self .toolbar = self .addToolBar( 'Exit' ) self .toolbar.addAction(exitAction) |
这里我们创建了一个工具栏,并且在其中插入一个动作对象。
Figure: Toolbar
将几个组件放在一起使用
在上面的例子中,我们创建了菜单栏、工具栏和状态栏。下面我们将创建一个中心组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a skeleton of a classic GUI application with a menubar, toolbar, statusbar, and a central widget. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ 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) exitAction = QAction(QIcon( 'exit24.png' ), 'Exit' , self ) exitAction.setShortcut( 'Ctrl+Q' ) exitAction.setStatusTip( 'Exit application' ) exitAction.triggered.connect( self .close) self .statusBar() menubar = self .menuBar() fileMenu = menubar.addMenu( '&File' ) fileMenu.addAction(exitAction) toolbar = self .addToolBar( 'Exit' ) toolbar.addAction(exitAction) 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_()) |
事例代码创建了一个带有菜单栏、工具栏和状态栏的经典GUI应用骨架。
1 2 | textEdit = QTextEdit() self .setCentralWidget(textEdit) |
在这里我们创建了一个文本编辑框组件。我们将它设置成QMainWindow的中心组件。中心组件占据了所有剩下的空间。
Figure: Main window
在这个部分的PyQt5教程中,我们使用了菜单、工具栏、状态栏和一个应用主窗口。