本文代码来自zetcode.com
QMainWindow
QMainWindow类提供应用的主窗口,我们可以创建一个带有状态栏、工具栏、菜单栏的经典应用程序框架。
Statusbar
statusbar是展示状态信息的控件
#!/usr/bin/python3
"""
This program creates a statusbar
"""
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_())
Simple menu
菜单栏
#!/usr/bin/python3
"""
This program creates a menubar. The menubar has one menu with an exit action
"""
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):
exitAct = QAction(QIcon('exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q') # 快捷键
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(qApp.quit) # 信号连接quit()方法
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Simple menu')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
上述例子创建了一个菜单栏,菜单包含退出按钮及其图标exit.png。
menuBar()方法创建了菜单栏
addMenu()方法添加了一个File菜单
addAction()方法添加了一个exitAct动作。
Submenu
子菜单
#!/usr/bin/python3
"""
This program creates a submenu
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
menubar = self.menuBar()
fileMenu = menubar.addMenu('File')
impMenu = QMenu('Import', self)
impAct = QAction('Import mail', self)
impMenu.addAction(impAct)
newAct = QAction('New', self)
fileMenu.addAction(newAct)
fileMenu.addMenu(impMenu)
self.setWindowTitle('Submenu')
self.setGeometry(300, 300, 250, 150)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
QMenu创建新菜单
addAction()方法为子菜单定义行为
Check menu
#!/usr/bin/python3
"""
This program creates a checkable menu
"""
import sys
from PyQt5.QtWidgets import QAction, QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusbar = self.statusBar()
self.statusbar.showMessage('Ready')
menubar = self.menuBar()
viewMenu = menubar.addMenu('View')
viewStatAct = QAction('View statusbar', self, checkable=True) # 默认显示
viewStatAct.setStatusTip('View statusbar')
viewStatAct.setChecked(True)
viewStatAct.triggered.connect(self.toggleMenu)
viewMenu.addAction(viewStatAct)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Check menu')
self.show()
def toggleMenu(self, state):
if state:
self.statusbar.show()
else:
self.statusbar.hide()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
本例实现可以显示/隐藏状态栏消息
Context menu
上下文菜单也称为弹出菜单,右击鼠标会得到上下文菜单。
#!/usr/bin/python3
"""
This program creates a context menu
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QMenu, QApplication, qApp
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction("New")
opnAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec_(self.mapToGlobal(event.pos())) # 从事件对象获取鼠标指针的坐标
if action == quitAct:
qApp.quit()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
mapToGlobal()方法将控件坐标转换为全屏坐标
Toolbar
工具栏提供了对最常用命令的快速访问
#!/usr/bin/python3
"""
This program creates a toolbar.
The toolbar has one action, with terminates the app, if triggered.
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QAction, QApplication, qApp
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAct = QAction(QIcon('exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAct)
self.setWindowTitle('Tool bar')
self.setGeometry(300, 300, 250, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
上述代码创建了一个只有一个功能的简单工具栏–退出
当点击工具栏上的退出图标(或者快捷键Ctrl+Q),应用退出
Putting it together
我们将创建一个集菜单栏、工具栏、状态栏于一体的应用框架
#!/usr/bin/python3
"""
This program creates a skeleton of a classic GUI application with a
menubar,statusbar,and a central widget.
"""
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)
exitAct = QAction(QIcon('exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(self.close)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAct)
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_())