这个章节,我们会创建状态栏、菜单和工具栏。菜单是一组位于菜单栏的命令。工具栏是应用的一些常用工具按钮。状态栏显示一些状态信息,通常在应用的底部。
状态栏是用来显示应用的状态信息的组件,状态栏是由QMainWindow创建的
程序展示
本例中,创建一个状态栏
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage("正常!")
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('状态栏')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
x = Example()
sys.exit(app.exec_())
代码解释
statusBar()
:创建状态栏,showMessage()
:在状态栏上显示一条信息
self.statusBar().showMessage('Ready')
程序展示
本例中,创建只有一个命令的菜单栏,这个命令就是终止应用。同时也创建了一个状态栏。而且还能使用快捷键Ctrl+Q
退出应用
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
qact = QAction(QIcon('icon.jpg'), 'exit', self)
qact.setShortcut("ctrl+q")
qact.setStatusTip('退出')
qact.triggered.connect(qApp.quit)
menu = self.menuBar()
filemenu = menu.addMenu("file")
filemenu.addAction(qact)
self.statusBar()
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('菜单栏')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
代码解释
QAction
是菜单栏、工具栏或者快捷键的动作的组合
创建一个图标、一个exit的标签和一个快捷键组合,都执行了一个动作,注意:ctrl+q之间不可以有空格
qact = QAction(QIcon('icon.jpg'), 'exit', self)
qact.setShortcut("ctrl+q")
创建状态栏,当鼠标悬停在菜单栏的时候,能显示当前状态
qact.setStatusTip('退出')
当执行exit或ctrl+q
动作时,就触发了QApplication
的quit()
事件,终止应用
qact.triggered.connect(qApp.quit)
menuBar()
:创建菜单栏。这里创建了一个菜单栏,并用addMenu()
在上面添加了一个file菜单,用addAction()
关联了点击退出应用的事件
menu = self.menuBar()
filemenu = menu.addMenu("file")
filemenu.addAction(qact)
子菜单是嵌套在菜单里面的二级或者三级菜单
程序展示
本例中,有两个子菜单,一个在File菜单下面,一个在File的Import下面
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication, QMenu
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建菜单栏,添加file菜单
menu = self.menuBar()
filemenu = menu.addMenu('file')
# 添加New子菜单
newact = QAction('new', filemenu)
filemenu.addAction(newact)
# 添加email子菜单
emailmenu = QMenu('email', filemenu)
emailmenu.addAction(QAction('163@mail', self))
emailmenu.addAction(QAction('qq@mail', self))
filemenu.addMenu(emailmenu)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('子菜单')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
代码解释
创建一级菜单
menu = self.menuBar()
filemenu = menu.addMenu('file')
创建名为new的二级菜单
newact = QAction('new', filemenu)
filemenu.addAction(newact)
使用QMenu
创建一个email菜单,父级是filemenu
emailmenu = QMenu('email', filemenu)
使用addAction()
添加动作,创建两个三级菜单
emailmenu.addAction(QAction('163@mail', self))
emailmenu.addAction(QAction('qq@mail', self))
将emailmenu添加为二级菜单
filemenu.addMenu(emailmenu)
程序展示
本例中,创建一个勾选菜单,这个行为/动作能切换状态栏显示或者隐藏
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.sbar = self.statusBar()
self.initUI()
def initUI(self):
self.sbar.showMessage('Ready Go')
menu = self.menuBar()
filemenu = menu.addMenu('file')
qact = QAction('open', filemenu, checkable=True)
qact.setStatusTip('open file')
qact.setChecked(True)
qact.triggered.connect(self.status)
filemenu.addAction(qact)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('勾选菜单')
self.show()
def status(self, s):
if s:
self.sbar.showMessage('checked')
else:
self.sbar.showMessage('unchecked')
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
用checkable
选项创建一个可勾选的菜单
qact = QAction('open', filemenu, checkable=True)
设置默认为选中状态
qact.setChecked(True)
绑定事件,勾选菜单时触发
qact.triggered.connect(self.status)
回调函数,勾选菜单时触发,s的值为False或True
def status(self, s):
if s:
self.sbar.showMessage('checked')
else:
self.sbar.showMessage('unchecked')
右键菜单也叫弹出框,是在某些场合下显示的一组命令
程序展示
本例中,创建右键菜单
import sys
from PyQt5.QtWidgets import QMainWindow, qApp, QMenu, QApplication, QAction
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu()
newact = cmenu.addAction('new')
openact = cmenu.addAction('open')
quitact = cmenu.addAction('quit')
act = cmenu.exec_(self.mapToGlobal(event.pos()))
if quitact == act:
qApp.quit()
# 效果一样
# def contextMenuEvent(self, event):
# cmenu = QMenu()
#
# cmenu.addAction('new')
# cmenu.addAction('open')
#
# qact = QAction('quit', cmenu)
# qact.triggered.connect(qApp.quit)
# cmenu.addAction(qact)
#
# cmenu.exec_(self.mapToGlobal(event.pos()))
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
代码解释
使用exec_()
方法显示菜单,从鼠标右键事件对象中获得当前坐标。mapToGlobal()
方法把当前组件的相对坐标转换为窗口的绝对坐标
action = cmenu.exec_(self.mapToGlobal(event.pos()))
如果右键菜单里点击了quit,就触发了退出事件
if action == quitAct:
qApp.quit()
程序展示
本例中,我们创建一个工具栏,并绑定退出应用的动作
import sys
from PyQt5.QtWidgets import QAction, QApplication, QMainWindow, qApp
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
qtool = QAction(QIcon('icon.jpg'), 'exit', self)
qtool.setShortcut('ctrl+q')
qtool.triggered.connect(qApp.quit)
toolbar = self.addToolBar('exit')
toolbar.addAction(qtool)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Toolbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
代码解释
用addToolBar()
创建工具栏对象,并用addAction()
将动作对象添加到工具栏
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAct)
主窗口就是状态栏、工具栏和菜单栏的总称,QMainWindow
提供了主窗口的功能,使用它就能创建状态栏、工具栏和菜单栏
程序展示
本例中,创建一个很经典的菜单框架,有右键菜单,工具栏和状态栏
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QTextEdit
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 菜单栏
menu = self.menuBar()
filemenu = menu.addMenu('file')
# 工具栏
toolbar = self.addToolBar('exit')
# 退出动作
quitact = QAction(QIcon('icon.jpg'), 'exit', self)
quitact.setShortcut('ctrl+q')
quitact.triggered.connect(self.close)
# 添加动作
filemenu.addAction(quitact)
toolbar.addAction(quitact)
# 状态栏
self.statusBar().showMessage('ready go')
# 文本编辑区
text = QTextEdit()
self.setCentralWidget(text)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('主窗口')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
代码解释
创建文本编辑区域,并把它放在QMainWindow
的中间区域,这个组件会占满所有剩余的区域
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
下一篇 事件和信号(一)