QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。
1,状态栏
状态栏控件比较简单,就先从这里开始。
源代码如下 :
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.InitUI()
def InitUI(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300,300,550,300)
self.setWindowTitle('我与PyQt5有个约会 --状态栏的实现')
self.setWindowIcon(QIcon('myico.ico'))
self.show()
# 关闭程序窗口
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
执行结果如下:
self.statusBar().showMessage('准备就绪')
要获取状态栏,我们调用QWidget.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。
2,菜单栏
1),创建一个简单的菜单栏。
实现简单的菜单栏的源代码如下 :
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.InitUI()
def InitUI(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300,300,550,300)
self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
self.setWindowIcon(QIcon('myico.ico'))
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')
self.exitQAct.triggered.connect(qApp.quit)
menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.exitQAct)
self.show()
# 关闭程序窗口
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。
执行的结果如下:
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')
QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。
self.exitQAct.triggered.connect(qApp.quit)
当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法。 这终止了应用程序。
menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.exitQAct)
menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。
上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。
2), 子菜单
子菜单是另一个菜单中的菜单。类似下图中的样子。
或者 :
子菜单实现的源代码 :
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.InitUI()
def InitUI(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300,300,550,300)
self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
self.setWindowIcon(QIcon('myico.ico'))
self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
self.newQAct.setShortcut('Ctrl+N')
self.newQAct.setStatusTip('新建文件')
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')
self.exitQAct.triggered.connect(qApp.quit)
saveMenu = QMenu('保存方式(&S)', self)
self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
self.saveQAct.setShortcut('Ctrl+S')
self.saveQAct.setStatusTip('保存文件')
self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
self.saveasQAct.setStatusTip('文件另存为')
saveMenu.addAction(self.saveQAct)
saveMenu.addAction(self.saveasQAct)
menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.newQAct)
fileMenu.addMenu(saveMenu)
fileMenu.addSeparator()
fileMenu.addAction(self.exitQAct)
self.show()
# 关闭程序窗口
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序效果如下:
在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。
saveMenu = QMenu('保存方式(&S)', self)
使用QMenu创建新菜单。
self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
self.saveQAct.setShortcut('Ctrl+S')
self.saveQAct.setStatusTip('保存文件')
self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
self.saveasQAct.setStatusTip('文件另存为')
saveMenu.addAction(self.saveQAct)
saveMenu.addAction(self.saveasQAct)
两个动作使用addAction()被添加到子菜单中。
3), 上下文菜单
Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。
先欣赏一下源代码大餐 :
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.InitUI()
def InitUI(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300,300,550,300)
self.setWindowTitle('我与PyQt5有个约会 --菜单栏的实现')
self.setWindowIcon(QIcon('myico.ico'))
self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
self.newQAct.setShortcut('Ctrl+N')
self.newQAct.setStatusTip('新建文件')
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')
self.exitQAct.triggered.connect(qApp.quit)
saveMenu = QMenu('保存方式(&S)', self)
self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
self.saveQAct.setShortcut('Ctrl+S')
self.saveQAct.setStatusTip('保存文件')
self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
self.saveasQAct.setStatusTip('文件另存为')
saveMenu.addAction(self.saveQAct)
saveMenu.addAction(self.saveasQAct)
menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.newQAct)
fileMenu.addMenu(saveMenu)
fileMenu.addSeparator()
fileMenu.addAction(self.exitQAct)
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu(self)
self.newQAct = cmenu.addAction("新建")
self.saveQAct = cmenu.addAction("保存")
self.exitQAct = cmenu.addAction("退出")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
if action == self.exitQAct:
qApp.quit()
# 关闭程序窗口
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序执行后,单击右键效果如下 :
要使用上下文菜单,我们必须重新实现contextMenuEvent()方法。
action = cmenu.exec_(self.mapToGlobal(event.pos()))
使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。
if action == self.exitQAct:
qApp.quit()
如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。
3,工具栏
各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。
源代码如下:
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.InitUI()
def InitUI(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300,300,650,300)
self.setWindowTitle('我与PyQt5有个约会 --菜单栏&工具栏的实现')
self.setWindowIcon(QIcon('myico.ico'))
#-------------------------------------------------------------------------
# 菜单栏
#-------------------------------------------------------------------------
self.newQAct = QAction(QIcon('.\images\open.png'),'新建(&N)',self)
self.newQAct.setShortcut('Ctrl+N')
self.newQAct.setStatusTip('新建文件')
self.exitQAct = QAction(QIcon('.\images\exit.png'), '退出(&E)', self)
self.exitQAct.setShortcut('Ctrl+Q')
self.exitQAct.setStatusTip('退出程序')
self.exitQAct.triggered.connect(qApp.quit)
saveMenu = QMenu('保存方式(&S)', self)
self.saveQAct = QAction(QIcon('.\images\save.png'),'保存...', self)
self.saveQAct.setShortcut('Ctrl+S')
self.saveQAct.setStatusTip('保存文件')
self.saveasQAct = QAction(QIcon('.\images\save_as.png'),'另存为...(&O)', self)
self.saveasQAct.setStatusTip('文件另存为')
saveMenu.addAction(self.saveQAct)
saveMenu.addAction(self.saveasQAct)
menubar = self.menuBar()
fileMenu = menubar.addMenu('文件(&F)')
fileMenu.addAction(self.newQAct)
fileMenu.addMenu(saveMenu)
fileMenu.addSeparator()
fileMenu.addAction(self.exitQAct)
#-------------------------------------------------------------------------
# 工具栏
#-------------------------------------------------------------------------
toolbar = self.addToolBar('工具栏')
toolbar.addAction(self.newQAct)
toolbar.addAction(self.saveQAct)
toolbar.addAction(self.saveasQAct)
toolbar.addAction(self.exitQAct)
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu(self)
self.newQAct = cmenu.addAction("新建")
self.saveQAct = cmenu.addAction("保存")
self.exitQAct = cmenu.addAction("退出")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
if action == self.exitQAct:
qApp.quit()
# 关闭程序窗口
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序执行效果如下:
#-------------------------------------------------------------------------
# 工具栏
#-------------------------------------------------------------------------
toolbar = self.addToolBar('工具栏')
toolbar.addAction(self.newQAct)
toolbar.addAction(self.saveQAct)
toolbar.addAction(self.saveasQAct)
toolbar.addAction(self.exitQAct)
工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。