PyQt(菜单栏、工具栏与状态栏)(菜单栏、工具栏与状态栏)

菜单栏、工具栏与状态栏

菜单栏

在QMainWindow对象的标题栏下方,水平的QMenuBar被保留显示QMenu对象。

QMenu类提供了一个可以添加到菜单栏的小控件,也用于创建上下文菜单和弹
出菜单。每个QMenu对象都可以包含一个或多个QAction对象或级联的QMenu对象。

要创建一个弹出菜单,PyQtAPI提供了createPopupMenu()函数;menuBar()函
数用于返回主窗口的QMenuBar对象;addMenu()函数可以将菜单添加到菜单栏中;
通过addAction()函数可以在菜单中进行添加操作;

在设计菜系统时使用的一些重要方法如表4-37所示

方法描述
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)
        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例子")
        self.resize(350,300)

    def processtrigger(self,q):
        print(q.text()+" is triggered")

if __name__ == '__main__':
    app=QApplication(sys.argv)
    demo=MenuDemo()
    demo.show()
    sys.exit(app.exec_())

运行结果

VeryCapture_20250513220134
代码分析:
在这个例子中,顶层窗口必须是QMainWindow对象,才可以引用QMenuBar
对象。
通过addMenu()方法将“File”菜单添加到菜单栏中。

bar=self.menuBar()
        file=bar.addMenu("File")

菜单中的操作按钮可以是字符串或QAction对象。

file=bar.addMenu("File")
        file.addAction("New")
        save=QAction("Save",self)
        file.addAction(save)

将子菜单添加到顶级菜单中。

edit=file.addMenu("Edit")
        edit.addAction("copy")
        edit.addAction("paste")

菜单发射triggered信号,将该信号连接到槽函数proecesstrigger(),该函数接收
信号的QAction对象。

file.triggered[QAction].connect(self.processtrigger)

QToolBar
QToolBar控件是由文本按钮、图标或其他小控件按钮组成的可移动面板,通常
位于菜单栏下方。
QToolBar类中的常用方法如表4-38所示。

方法描述
addAction()添加具有文木或图标的工具按纽
addSeperator()分组显示工具按钮
addWidget()添加工具栏中按钮以外的控件
addToolBar()使用QMainWindow类的方法添加一个新的工具栏
setMovable()工具栏变得可移动
setOrientation()工具的方向可以没置为Qt.Horizontal或Qt.veflical

每当单击工具栏中的按钮时,都将发射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("toolbar 例子")
        self.resize(300,200)

        layout=QVBoxLayout()
        tb=self.addToolBar("File")
        new=QAction(QIcon("./images/new.png"),"new",self)
        tb.addAction(new)
        open=QAction(QIcon("./images/open.png"),"open",self)
        tb.addAction(open)
        save=QAction(QIcon("./images/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__':
    app=QApplication(sys.argv)
    demo=ToolBarDemo()
    demo.show()
    sys.exit(app.exec_())

运行结果

image
代码分析:
在这个例子中,首先调用addToolBar()方法在工具栏区域添加文件工具栏。

tb=self.addToolBar("File")

然后,添加具有文本标题的工具按钮,工具栏通常包含图形按钮。具有图标和
名称的QAction对象将被添加到工具栏中。

new=QAction(QIcon("./images/new.png"),"new",self)
        tb.addAction(new)
        open=QAction(QIcon("./images/open.png"),"open",self)
        tb.addAction(open)
        save=QAction(QIcon("./images/save.png"),"save",self)
        tb.addAction(save)

最后,将actionTriggered信号连接到槽函数toolbtnpressed()。

tb.actionTriggered[QAction].connect(self.toolbtnpressed)

QStatusBar

MainWindow对象在底部保留有一个水平条,作为状态栏(QStatusBar),用于
显示永久的或临时的状态信息。

通过主窗口的QMainWindow的setStatusBar()函数设置状态栏,核心代码如下:

self.statusBar=QStatusBar()
self.setStatusBar(self.statusBar)

QStatusBar类中的常用方法如表4-39所示。

方法描述
addWidget()在状态栏中添加给定的窗口小控件对象
addPernanentWidget()在状态栏中永久添址给定的口小控件对象
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=self.menuBar()
        file=bar.addMenu("File")
        file.triggered[QAction].connect(self.processtrigger)
        self.setCentralWidget(QStatusBar(self))
        self.statusBar=QStatusBar()
        self.setWindowTitle("QStatusBar 例子")
        self.setStatusBar(self.statusBar)

    def processtrigger(self,q):
        if (q.text()=="show"):
            self.statusBar.showMessage(q.text()+"菜单选项被点击了",5000)

if __name__ == "__main__":
    app=QApplication(sys.argv)
    demo=StatusDemo()
    demo.show()
    sys.exit(app.exec_())

运行结果

image
代码分析:
在这个例子中,顶层窗口MainWindow有一个菜单栏和一个QTextEdit对象,
作为中心控件。
当单击MenuBar的菜单时,将triggered信号与槽函数processTrigger()进行绑定。

file.triggered[QAction].connect(self.processtrigger)

当单击“show”菜单选项时,会在状态栏显示提示信息,并在5秒后消失。

 if (q.text()=="show"):
            self.statusBar.showMessage(q.text()+"菜单选项被点击了",5000)

QPrinter

打印图像是图像处理软件中的一个常用功能。打印图像实际上是在
QPaintDevice中画图,与平常在QWidget、QPixmap和QImage中画图一样,都是创
建一个QPainter对象进行画图的,只是打印使用的是QPrinter,它本质上也是一个
QPaintDevice(绘图设备)。

QPrinter的使用

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QImage,QIcon,QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QSizePolicy, QAction, QMenu
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)
        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/printer.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对象,并指定绘图设备为一个QPrintr对象
            painter=QPrinter(printer)
            #获得QPainter对象的视口矩形
            rect=painter.viewport()
            #获得图像的大小
            size=self.image.size()
            #按照图形的比例大小重新设置视口矩形
            size.scale(rect.size(),Qt.KeepAspectRatio)
            painter.setPrinter(rect.x(),rect.y(),size.width(),size.height())
            #设置QPainter窗口大小为图像的大小
            painter.setWindow(self.image.rect())
            #打印
            painter.drawImage(0,0,self.image)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    main=MainWindow()
    main.show()
    sys.exit(app.exec_())

运行结果

image

扫描关注微信公众号!
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢铁男儿

赛博功德充值,BUG退散

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值