界面搭建
QMainWindow类提供了一个主应用程序窗口。 这使得能够创建具有状态栏,工具栏和菜单栏的经典应用程序框架。
状态栏
这个比较简单,先从这里开始。
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.statusBar().showMessage('准备就绪')
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('状态栏')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
执行结果:
self.statusBar().showMessage('准备就绪')
要获取状态栏,我们调用QtGui.QMainWindow类的statusBar()方法。 该方法的第一个调用创建一个状态栏。 后续调用返回状态栏对象。 showMessage()在状态栏上显示一条消息。
菜单
简单的菜单
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.gui_init()
def gui_init(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('简单的菜单')
exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')
exit_act.triggered.connect(qApp.quit)
meu_bar = self.menuBar()
file_menu = meu_bar.addMenu('文件(&F)')
file_menu.addAction(exit_act)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在上面的例子中,我们用一个菜单创建一个菜单。 此菜单将包含一个选择时终止应用程序的操作。 还创建状态栏。 该操作可通过Ctrl + Q快捷方式访问。
执行结果 执行结果:
exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')
QAction是使用菜单栏,工具栏或自定义键盘快捷方式执行操作的抽象。在上述三行中,我们创建一个具有特定图标和“退出”标签的动作。此外,为此操作定义了快捷方式。当我们将鼠标指针悬停在菜单项上时,第三行创建状态栏显示在状态栏中。
exit_act.triggered.connect(qApp.quit)
当我们选择这个特定的动作时,发出触发信号。 信号连接到QApplication小部件的quit()方法,终止了应用程序。
meu_bar = self.menuBar()
file_menu = meu_bar.addMenu('文件(&F)')
file_menu.addAction(exit_act)
menuBar()方法创建一个菜单栏。 我们使用addMenu()创建文件菜单,并使用addAction()添加操作。
上面的代码中我们在退出、文件后面都增加了“&”这个符号,增加这个符号后,当我们按住“Alt+F”的时候就能快速打开文件这个菜单,同理按住“Alt+E”的时候就能退出了。
子菜单
子菜单是另一个菜单中的菜单。类似下图中的样子。
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.ui_init()
def ui_init(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('子菜单')
exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')
exit_act.triggered.connect(qApp.quit)
save_menu = QMenu('保存方式(&S)', self)
save_act = QAction(QIcon('保存.png'), '保存...', self)
save_act.setShortcut('Ctrl+S')
save_act.setStatusTip('保存文件')
save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
save_as_act.setStatusTip('文件另存为')
save_menu.addAction(save_act)
save_menu.addAction(save_as_act)
new_act = QAction(QIcon('新建.png'), '新建(&N)',self)
new_act.setShortcut('Ctrl+N')
men_bar = self.menuBar()
file_menu = men_bar.addMenu('文件(&F)')
file_menu.addAction(new_act)
file_menu.addMenu(save_menu)
file_menu.addSeparator()
file_menu.addAction(exit_act)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
执行结果 执行结果:
在这个例子中,我们有三个菜单项: 其中两个位于文件菜单中(新建、退出),另一个位于文件的保存子菜单中。
save_menu = QMenu('保存方式(&S)', self)
使用QMenu创建新菜单
save_act = QAction(QIcon('保存.png'), '保存...', self)
save_act.setShortcut('Ctrl+S')
save_act.setStatusTip('保存文件')
save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
save_as_act.setStatusTip('文件另存为')
save_menu.addAction(save_act)
save_menu.addAction(save_as_act)
两个动作使用addAction()被添加到子菜单中。
上下文菜单
Windows操作系统中任何地方右击鼠标会出现俗称的“右键菜单”,其实就是指上下文菜单。
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.ui_init()
def ui_init(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('子菜单')
exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')
exit_act.triggered.connect(qApp.quit)
save_menu = QMenu('保存方式(&S)', self)
save_act = QAction(QIcon('保存.png'), '保存...', self)
save_act.setShortcut('Ctrl+S')
save_act.setStatusTip('保存文件')
save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
save_as_act.setStatusTip('文件另存为')
save_menu.addAction(save_act)
save_menu.addAction(save_as_act)
new_act = QAction(QIcon('新建.png'), '新建(&N)',self)
new_act.setShortcut('Ctrl+N')
men_bar = self.menuBar()
file_menu = men_bar.addMenu('文件(&F)')
file_menu.addAction(new_act)
file_menu.addMenu(save_menu)
file_menu.addSeparator()
file_menu.addAction(exit_act)
self.show()
def contextMenuEvent(self, QContextMenuEvent):
c_menu = QMenu(self)
new_act = c_menu.addAction('新建')
save_act = c_menu.addAction('保存')
quit_act = c_menu.addAction('退出')
action = c_menu.exec_(self.mapToGlobal(QContextMenuEvent.pos()))
if action == quit_act:
qApp.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
执行结果 执行结果:
要使用上下文菜单,我们必须重新实现 contextMenuEvent() 方法。
action = c_menu.exec_(self.mapToGlobal(QContextMenuEvent.pos()))
使用exec_()方法显示上下文菜单。 从事件对象获取鼠标指针的坐标。 mapToGlobal()方法将窗口小部件坐标转换为全局屏幕坐标。
if action == quit_act:
qApp.quit()
如果从上下文菜单返回的操作等于退出操作,我们终止应用程序。
工具栏
各项命令都是在菜单栏当中,但是我们可以把一些常用的命令放在工具栏上,例如新建、打开、保存等等。
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
import sys
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.ui_init()
def ui_init(self):
self.statusBar().showMessage('准备就绪')
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('工具栏')
exit_act = QAction(QIcon('退出.png'), '退出(&E)', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('退出程序')
exit_act.triggered.connect(qApp.quit)
save_menu = QMenu('保存方式(&S)', self)
save_act = QAction(QIcon('保存.png'), '保存...', self)
save_act.setShortcut('Ctrl+S')
save_act.setStatusTip('保存文件')
save_as_act = QAction(QIcon('另存为.png'), '另存为...(&O)', self)
save_as_act.setStatusTip('文件另存为')
save_menu.addAction(save_act)
save_menu.addAction(save_as_act)
new_act = QAction(QIcon('新建.png'), '新建(&N)', self)
new_act.setShortcut('Ctrl+N')
new_act.setStatusTip('新建文件')
men_bar = self.menuBar()
file_menu = men_bar.addMenu('文件(&F)')
file_menu.addAction(new_act)
file_menu.addMenu(save_menu)
file_menu.addSeparator()
file_menu.addAction(exit_act)
tool_bar = self.addToolBar('工具栏')
tool_bar.addAction(new_act)
tool_bar.addAction(exit_act)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
执行结果 执行结果:
toolbar = self.addToolBar('工具栏')
toolbar.addAction(newAct)
toolbar.addAction(exitAct)
工具栏使用addToolBar()方法创建。 我们使用addAction()向工具栏添加两个动作对象。