PyQt5中的菜单和工具栏
在这部分的PyQt5教程中,我们将创建菜单和工具栏。菜单式位于菜单栏的一组命令操作。工具栏是应用窗体中由按钮和一些常规命令操作组成的组件。
主窗口
QMainWindow类提供了一个应用主窗口。默认创建一个拥有状态栏、工具栏和菜单栏的经典应用窗口骨架。
状态栏
状态栏是用来显示状态信息的组件。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 #__author:Administrator 4 #date:2018/7/23 5 6 import sys 7 from PyQt5.QtWidgets import QMainWindow,QApplication 8 9 10 class Example(QMainWindow): 11 def __init__(self): 12 super().__init__() 13 self.initUI() 14 def initUI(self): 15 self.statusBar().showMessage('Ready') 16 17 self.setGeometry(300,300,250,150) 18 self.setWindowTitle('状态栏') 19 self.show() 20 21 if __name__=="__main__": 22 app=QApplication(sys.argv) 23 ex=Example() 24 sys.exit(app.exec_())
状态栏又QMainWindow组件帮助创建完成(依赖于QMainWindow组件)。
self.statusBar().showMessage('Ready')
为了得到状态栏,我们调用了QtGui.QMainWindow
类的statusBar()方法。第一次调用这个方法创建了一个状态栏。随后方法返回状态栏对象。然后用showMessage()方法在状态栏上显示一些信息。
菜单栏
菜单栏是GUI应用的常规组成部分。是位于各种菜单中的一组命令操作(Mac OS 对待菜单栏有些不同。为了获得全平台一致的效果,我们可以在代码中加入一行:menubar.setNativeMenuBar(False)
)。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 #__author:Administrator 4 #date:2018/7/23 5 6 import sys 7 from PyQt5.QtWidgets import QMainWindow,QApplication,QAction,qApp 8 from PyQt5.QtGui import QIcon 9 10 11 12 class Example(QMainWindow): 13 def __init__(self): 14 super().__init__() 15 self.initUI() 16 def initUI(self): 17 exitAction=QAction(QIcon('ico.png'),'&Exit',self) 18 exitAction.setShortcut('Ctrl+Q') 19 exitAction.setStatusTip('Exit application') 20 exitAction.triggered.connect(qApp.quit) 21 22 23 24 25 26 self.statusBar() 27 menubar=self.menuBar() 28 fileMenu=menubar.addMenu('&File') 29 fileMenu.addAction(exitAction) 30 31 self.setGeometry(300,300,250,150) 32 self.setWindowTitle('菜单') 33 self.show() 34 35 if __name__=="__main__": 36 app=QApplication(sys.argv) 37 ex=Example() 38 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 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 #__author:Administrator 4 #date:2018/7/23 5 6 import sys 7 from PyQt5.QtWidgets import QMainWindow,QApplication,QAction,qApp 8 from PyQt5.QtGui import QIcon 9 10 11 12 class Example(QMainWindow): 13 def __init__(self): 14 super().__init__() 15 self.initUI() 16 def initUI(self): 17 exitAction=QAction(QIcon('ico.png'),'Exit',self) 18 exitAction.setShortcut('Ctrl+Q') 19 # exitAction.setStatusTip('Exit application') 20 exitAction.triggered.connect(qApp.quit) 21 22 self.toolbar=self.addToolBar('Exit') 23 self.toolbar.addAction(exitAction) 24 25 # self.statusBar() 26 # menubar=self.menuBar() 27 # fileMenu=menubar.addMenu('&File') 28 # fileMenu.addAction(exitAction) 29 30 self.setGeometry(300,300,250,150) 31 self.setWindowTitle('工具栏') 32 self.show() 33 34 if __name__=="__main__": 35 app=QApplication(sys.argv) 36 ex=Example() 37 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) |
这里我们创建了一个工具栏,并且在其中插入一个动作对象。
将几个组件放在一起使用
在上面的例子中,我们创建了菜单栏、工具栏和状态栏。下面我们将创建一个中心组件。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 #__author:Administrator 4 #date:2018/7/23 5 6 import sys 7 from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication 8 from PyQt5.QtGui import QIcon 9 10 11 class Example(QMainWindow): 12 13 def __init__(self): 14 super().__init__() 15 16 self.initUI() 17 18 def initUI(self): 19 textEdit = QTextEdit() 20 self.setCentralWidget(textEdit) 21 22 exitAction = QAction(QIcon('ico.png'), 'Exit', self) 23 exitAction.setShortcut('Ctrl+Q') 24 exitAction.setStatusTip('Exit application') 25 exitAction.triggered.connect(self.close) 26 27 self.statusBar() 28 29 menubar = self.menuBar() 30 fileMenu = menubar.addMenu('&File') 31 fileMenu.addAction(exitAction) 32 33 toolbar = self.addToolBar('Exit') 34 toolbar.addAction(exitAction) 35 36 self.setGeometry(300, 300, 350, 250) 37 self.setWindowTitle('Main window') 38 self.show() 39 40 41 if __name__ == '__main__': 42 app = QApplication(sys.argv) 43 ex = Example() 44 sys.exit(app.exec_())
事例代码创建了一个带有菜单栏、工具栏和状态栏的经典GUI应用骨架。
1
2
|
textEdit = QTextEdit() self .setCentralWidget(textEdit) |
在这里我们创建了一个文本编辑框组件。我们将它设置成QMainWindow的中心组件。中心组件占据了所有剩下的空间。
综合练习::
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/7/24 ''' import sys from PyQt5.QtWidgets import QMainWindow,QApplication, QAction,qApp,QMessageBox,QDesktopWidget from PyQt5.QtGui import QIcon class Example(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 工具栏 # tuiAction=QAction(QIcon('123.png'),'退出',self) # tuiAction.setShortcut('Ctrl+Q') # tuiAction.triggered.connect(qApp.quit) #菜单栏 ''' QAction是一个用于菜单栏、工具栏或自定义快捷键的抽象动作行为。在上面的三行中, 我们创建了一个有指定图标和文本为'Exit'的标签。另外,还为这个动作定义了一个快捷键。 第三行创建一个当我们鼠标浮于菜单项之上就会显示的一个状态提示。 :return: ''' exitAction=QAction(QIcon('123.png'),'&退出',self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('退出程序') #信号连接到QApplication组件的quit()方法 exitAction.triggered.connect(self.close) newAction=QAction(QIcon('456.jpg'),'&新建',self) newAction.setShortcut('Ctrl+N') newAction.setStatusTip('新建工程') newAction.triggered.connect(self.shuohua) self.toolbar=self.addToolBar('exit') self.toolbar.addAction(exitAction) self.toolbar.addAction(newAction) '''menuBar() 方法创建了一个菜单栏。我们创建一个file菜单,然后将退出动作添加到file菜单中。 ''' menubar=self.menuBar() fileMenu=menubar.addMenu('&文件') fileMenu.addAction(newAction) fileMenu.addAction(exitAction) editMenu=menubar.addMenu('&编辑') viewMenu=menubar.addMenu('&视图') helpMenu=menubar.addMenu('&帮助') #状态栏 '''为了得到状态栏,我们调用了QtGui.QMainWindow类的statusBar() 方法。第一次调用这个方法创建了一个状态栏。随后方法返回状态栏对象。然后用showMessage() 方法在状态栏上显示一些信息。 ''' self.statusBar() #self.statusBar().showMessage('准好就绪') #实例化窗口 # self.setGeometry(300,300,250,150) self.resize(500,400) self.center() self.setWindowTitle('状态栏') self.show() def shuohua(self): replay=QMessageBox.question(self,'提示','确定新建吗?',QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) if replay==QMessageBox.Yes: print('OK') else: print("no") def center(self): #获得主窗口的一个矩形特定几何图形。这包含了窗口的框架 qr=self.frameGeometry() #算出相对于显示器的绝对值。并且从这个绝对值中,我们获得了屏幕中心点。 center_point=QDesktopWidget().availableGeometry().center() #矩形的中心设置到屏幕的中间去。矩形的大小并不会改变。 #print(center_point) #PyQt5.QtCore.QPoint(959, 519) qr.moveCenter(center_point) #移动了应用窗口的左上方的点到qr矩形的左上方的点,因此居中显示在我们的屏幕上 self.move(qr.topLeft()) def closeEvent(self, event): repy=QMessageBox.question(self,'消息','确定退出?',QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if repy==QMessageBox.Yes: event.accept() else: event.ignore() if __name__=='__main__': app=QApplication(sys.argv) ex=Example() sys.exit(app.exec_())
448