在 QMainWindow对象的标题栏下方,水平的QMenuBar被保留显示 QMenu对象。
QMenu类提供了一个可以添加到菜单栏的小控件,也用于创建上下文菜单和弹出菜单。每个QMenu对象都可以包含一个或多个QAction对象或级联的QMenu对象。·
要创建一个弹出菜单,PyQt API 提供了createPopupMenu()函数;menuBar()函数用于返回主窗口的 QMenuBar对象;addMenu()函数可以将菜单添加到菜单栏中;通过addAction()函数可以在菜单中进行添加操作。
设计菜单系统时的一些重要方法:
方法 | 描述 |
---|---|
menuBar() | 返回主窗口的QMenuBar对象 |
addMenu() | 在菜单栏中添加一个新的QMenu对象 |
addAction() | 向QMenu小控件中添加一个操作按钮,其中包含文本或图标 |
setEnabled() | 将操作按钮状态设置为启用/禁用 |
addSeperator() | 在菜单中添加一条分割线 |
clear() | 删除菜单/菜单栏的内容 |
setShortcut() | 将快捷键关联到操作按钮 |
setText() | 设置菜单项的文本 |
setTitle() | 设置QMenu小控件的标题 |
text() | 返回与QAction对象关联的文本 |
title() | 返回QMenu小控件的标题 |
单击任何QAction 按钮时,QMenu对象都会发射triggered信号。
案例——QMenuBar的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MenuDemo(QMainWindow):
def __init__(self,parent = None):
super(MenuDemo, self).__init__(parent)
layout = QHBoxLayout()
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
save = QAction("Save",self)
save.setShortcut("Ctrl+S")
file.addAction(save)
edit = file.addMenu("Edit")
edit.addAction("copy")
edit.addAction("paste")
quit = QAction("Quit",self)
file.addAction(quit)
file.triggered[QAction].connect(self.processtrigger)
self.setLayout(layout)
self.setWindowTitle("Menu案例")
def processtrigger(self , q):
print(q.text() + "is triggered")
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
win = MenuDemo()
win.show()
sys.exit(app.exec_())
QToolBar控件是由文本按钮、图标或其他小控件按钮组成的可移动面板,通常位于菜单栏下方。
QToolBar类中的常用方法
方法 | 描述 |
---|---|
addAction() | 添加具有文本或图标的工具按钮 |
addSeperator() | 分组显示工具按钮 |
addWidget() | 添加工具栏中按钮以外的控件 |
addToolBar() | 使用QMainWindow类的方法添加一个新的工具栏 |
setMovable() | 工具栏变得可移动 |
setOrientation() | 工具栏的方向可以设置为Qt.Horizaontal或Qt.vertical |
每当单击工具栏中的按钮时,都将发射actionTriggered信号。另外,这个信号将关联的 QAction对象的引用发送到连接的槽函数上。
案例——QToolBar的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class ToolBarDemo(QMainWindow):
def __init__(self,parent = None):
super(ToolBarDemo, self).__init__(parent)
self.setWindowTitle("工具栏案例")
self.resize(300 , 200)
layout = QVBoxLayout()
tb = self.addToolBar("File")
new = QAction(QIcon("new.png"),"new",self)
tb.addAction(new)
open = QAction(QIcon("open.png"),"open",self)
tb.addAction(open)
save = QAction(QIcon("save.png"),"save",self)
tb.addAction(save)
tb.actionTriggered[QAction].connect(self.toolbtnpressed)
self.setLayout(layout)
def toolbtnpressed(self,a):
print("Pressed tool button is " , a.text())
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
win = ToolBarDemo()
win.show()
sys.exit(app.exec_())
MainWindow 对象在底部保留有一个水平条,作为状态栏(QStatusBar),用于显示永久的或临时的状态信息。通过主窗口的QMainWindow的 setStatusBar()函数设置状态栏:
self.statusBar = QStatusBar()
self.setStatusBar(self.statusBar)
QStatusBar类中的常用方法
方法 | 描述 |
---|---|
addWidget() | 在状态栏中添加给定的窗口小控件对象 |
addPermanentWidget() | 在状态栏中永久添加给定的窗口小控件对象 |
showMessage() | 在状态栏中显示一条临时信息指定时间间隔 |
clearMessage() | 删除正在显示的临时信息 |
removeWidget() | 从状态栏中删除指定的小控件 |
案例——QStatusBar的使用
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class StatusDemo(QMainWindow):
def __init__(self,parent = None):
super(StatusDemo, self).__init__(parent)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("show")
file.triggered[QAction].connect(self.processTrigger)
self.setCentralWidget(QTextEdit())
self.statusBar= QStatusBar()
self.setWindowTitle("状态栏案例")
self.setStatusBar(self.statusBar)
def processTrigger(self , q):
if(q.text() == "show"):
self.statusBar.showMessage(q.text() + "菜单选项被点击了",5000)
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
win = StatusDemo()
win.show()
sys.exit(app.exec_())
打印图像是图像处理软件中的一个常用功能。打印图像实际上是在QPaintDevice中画图,与平常在QWidget、QPixmap和 QImage中画图一样,都是创建一个 QPainter对象进行画图的,只是打印使用的是 QPrinter,它本质上也是一个QPaintDevice(绘图设备)。
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QImage, QIcon, QPixmap, QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QSizePolicy, QAction
from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle(self.tr("打印图片"))
# 创建一个放置图像的QLabel对象imageLabel,并将该QLabel对象设置为中心窗体。
self.imageLabel = QLabel()
self.imageLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
self.setCentralWidget(self.imageLabel)
self.image = QImage()
# 创建菜单,工具条等部件
self.createActions()
self.createMenus()
self.createToolBars()
# 在imageLabel对象中放置图像
if self.image.load("./images/screen.png"):
self.imageLabel.setPixmap(QPixmap.fromImage(self.image))
self.resize(self.image.width(), self.image.height())
def createActions(self):
self.PrintAction = QAction(QIcon("images/screen.png"), self.tr("打印"), self)
self.PrintAction.setShortcut("Ctrl+P")
self.PrintAction.setStatusTip(self.tr("打印"))
self.PrintAction.triggered.connect(self.slotPrint)
def createMenus(self):
PrintMenu = self.menuBar().addMenu(self.tr("打印"))
PrintMenu.addAction(self.PrintAction)
def createToolBars(self):
fileToolBar = self.addToolBar("Print")
fileToolBar.addAction(self.PrintAction)
def slotPrint(self):
# 新建一个QPrinter对象
printer = QPrinter()
# 创建一个QPrintDialog对象,参数为QPrinter对象
printDialog = QPrintDialog(printer, self)
'''
判断打印对话框显示后用户是否单击“打印”按钮,若单击“打印”按钮,
则相关打印属性可以通过创建QPrintDialog对象时使用的QPrinter对象获得,
若用户单击“取消”按钮,则不执行后续的打印操作。
'''
if printDialog.exec_():
# 创建一个QPainter对象,并指定绘图设备为一个QPrinter对象。
painter = QPainter(printer)
# 获得QPainter对象的视口矩形
rect = painter.viewport()
# 获得图像的大小
size = self.image.size()
# 按照图形的比例大小重新设置视口矩形
size.scale(rect.size(), Qt.KeepAspectRatio)
painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
# 设置QPainter窗口大小为图像的大小
painter.setWindow(self.image.rect())
# 打印
painter.drawImage(0, 0, self.image)
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())