python3+PyQt5 图形项的自定义和交互--实现page Designer应用程序

通过Python3和PyQt5,本文详细介绍了如何实现一个名为Page Designer的应用程序,该应用利用QGraphicsView、QGraphicsScene和QGraphicsItem来创建包含文本、图片和框的页面。由于PyQt5中一些图形类已过时,代码进行了相应的调整,如使用QTransform替代QMatrix,setRotation代替rotate等。此外,由于event.delta()的过时,代码重写了wheelEvent方法。为了提高代码可读性,增加了一个新类,并针对QStyleOptionGraphicsItem.levelOfDetail的过时,改用option.levelOfDetailFromTransform(self.transform())。最后,代码还展示了如何添加带有菜单的按钮。
摘要由CSDN通过智能技术生成

本文通过Python3+PyQt5实现《python Qt Gui 快速编程》这本书的page Designer应用程序,采用QGraphicsView,QGraphicsScene,QGraphicsItem,这个程序包含有多个文本,图片和框的页面。有些图形类在PyQt5已过时,所以本代码改动幅度比较大。主要的类或方法的改变如下:
QMatrix==>QTransform
setMatrix==>setTransform
rotate ==> setRotation
本例中,由于event.delta()已过时,还重写了wheelEvent方法:

    def wheelEvent(self, event):
        #factor = 1.41 ** (-event.delta() / 240.0) 
        #factor = 1.41 ** (-abs(event.startX()-event.y()) / 240.0)
        factor = event.angleDelta().y()/120.0
        if event.angleDelta().y()/120.0 > 0:
            factor=2
        else:
            factor=0.5
        self.scale(factor, factor)

为了保持代码可读行,增加了一个类:

class GraphicsPixmapItem(QGraphicsPixmapItem):        #add by yangrongdong
    def __init__(self,pixmap):
        super(QGraphicsPixmapItem, self).__init__(pixmap)

本例中还有包含菜单的按钮:

            if text == "&Align":
                menu = QMenu(self)
                for text, arg in (
                        ("Align &Left", Qt.AlignLeft),
                        ("Align &Right", Qt.AlignRight),
                        ("Align &Top", Qt.AlignTop),
                        ("Align &Bottom", Qt.AlignBottom)):
                    wrapper = functools.partial(self.setAlignment, arg)
                    self.wrapped.append(wrapper)
                    menu.addAction(text, wrapper)
                button.setMenu(menu)

本例中还针对QStyleOptionGraphicsItem.levelOfDetail已过时,改写如下:
option.levelOfDetailFromTransform(self.transform())
下面为完整的代码:

#!/usr/bin/env python3


import functools
import random
import sys
from PyQt5.QtCore import (QByteArray, QDataStream, QFile, QFileInfo,
                          QIODevice, QPoint, QPointF, QRectF, Qt)
from PyQt5.QtWidgets import (QApplication, QDialog,
                             QDialogButtonBox, QFileDialog, QFontComboBox,
                             QGraphicsItem, QGraphicsPixmapItem,
                             QGraphicsScene, QGraphicsTextItem, QGraphicsView, QGridLayout,
                             QHBoxLayout, QLabel, QMenu, QMessageBox,QPushButton, QSpinBox,
                             QStyle, QTextEdit, QVBoxLayout)
from PyQt5.QtGui import QFont,QCursor,QFontMetrics,QTransform,QPainter,QPen,QPixmap
from PyQt5.QtPrintSupport import QPrinter,QPrintDialog

MAC = True
try:
    from PyQt5.QtGui import qt_mac_set_native_menubar
except ImportError:
    MAC = False

#PageSize = (595, 842) # A4 in points
PageSize = (612, 792) # US Letter in points
PointSize = 10

MagicNumber = 0x70616765
FileVersion = 1

Dirty = False


class TextItemDlg(QDialog):

    def __init__(self, item=None, position=None, scene=None, parent=None):
        super(QDialog, self).__init__(parent)

        self.item = item
        self.position = position
        self.scene = scene

        self.editor = QTextEdit()
        self.editor.setAcceptRichText(False)
        self.editor.setTabChangesFocus(True)
        editorLabel = QLabel("&Text:")
        editorLabel.setBuddy(self.editor)
        self.fontComboBox = QFontComboBox()
        self.fontComboBox.setCurrentFont(QFont("Times", PointSize))
        fontLabel = QLabel("&Font:")
        fontLabel.setBuddy(self.fontComboBox)
        self.fontSpinBox = QSpinBox()
        self.fontSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.fontSpinBox.setRange(6, 280)
        self.fontSpinBox.setValue(PointSize)
        fontSizeLabel = QLabel("&Size:")
        fontSizeLabel.setBuddy(self.fontSpinBox)
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
                                          QDialogButtonBox.Cancel)
        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)

        if self.item is not None:
            self.editor.setPlainText(self.item.toPlainText())
            self.fontComboBox.setCurrentFont(self.item.font())
            self.fontSpinBox.setValue(self.item.font().pointSize())

        layout = QGridLayout()
        layout.addWidget(editorLabel, 0, 0)
        layout.addWidget(self.editor, 1, 0, 1, 6)
        layout.addWidget(fontLabel, 2, 0)
        layout.addWidget(self.fontComboBox, 2, 1, 1, 2)
        layout.addWidget(fontSizeLabel, 2, 3)
        layout.addWidget(self.fontSpinBox, 2, 4, 1, 2)
        layout.addWidget(self.buttonBox, 3, 0, 1, 6)
        self.setLayout(layout)


        self.fontComboBox.currentFontChanged.connect(self.updateUi)
        self.fontSpinBox.valueChanged.connect(self.updateUi)
        self.editor.textChanged.connect(self.updateUi)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.setWindowTitle("Page Designer - {0} Text Item".format(
                "Add" 
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python3是一种编程语言,它提供了很多库和框架可以用于各种应用开发。PyQt5Python3的一个GUI(图形用户界面)库,它允许我们创建各种图形界面应用程序。PyCharm是一个Python集成开发环境(IDE),它提供了丰富的功能和工具,可以方便地进行Python编程和应用程序开发。 在Python3中,我们可以使用PyQt5库来访问和控制摄像头。通过使用PyQt5的QCamera和QCameraViewfinder类,我们可以访问计算机上已连接的摄像头设备,并在应用程序中显示摄像头视频流。这样我们就能够在应用程序中捕捉摄像头的图像,并进行进一步的处理和分析。 PyCharm是一个非常流行的Python开发工具,它提供了许多有用的功能来帮助我们编写、调试和测试Python代码。在PyCharm中,我们可以直接编写Python代码,并使用其强大的代码编辑器和自动补全功能来提高编码效率。同时,PyCharm还提供了集成的调试器,可以方便地调试和跟踪代码的执行过程。 因此,如果我们想在Python3中使用PyQt5库来访问和控制摄像头,并且希望使用一个强大的开发工具来编写和调试代码,我们可以选择使用PyCharm作为我们的开发环境。PyCharm提供了直观的界面和丰富的功能,可以让我们更轻松地编写和调试基于PyQt5的摄像头应用程序。 ### 回答2: Python3是一种高级编程语言,PyQt5是用于创建图形界面应用程序Python库,PyCharm是一种集成开发环境(IDE)。摄像头通常是指用于捕捉图像或视频的设备。 在Python中使用摄像头,可以使用OpenCV库来实现。OpenCV是一个开源计算机视觉库,可用于处理图像和视频。 要在PyQt5中使用摄像头,可以通过使用QCamera类来获取和控制摄像头。您可以将QCamera对象与QCameraViewfinder或QGraphicsView一起使用,以便在应用程序中显示摄像头捕捉的图像。 对于IDE,PyCharm是一种流行的Python开发环境,具有代码编辑器、调试器、版本控制等功能。PyCharm提供了丰富的功能和工具,使Python开发更加高效和便捷。 要在PyCharm中使用Python3PyQt5以及摄像头,您可以首先安装Python3PyQt5库。然后,您可以设置目,并使用PyCharm提供的编辑器编写代码。在代码中,您可以导入所需的库和模块,以及使用适当的代码来处理摄像头和图像。 总而言之,您可以使用Python3编写具有PyQt5界面的应用程序,并在PyCharm中进行开发和调试。通过使用OpenCV库,您还可以使用摄像头捕捉图像和视频。 ### 回答3: Python3是一种高级编程语言,广泛应用于各个领域的软件开发和数据分析。PyQt5是一个Python模块,用于创建交互式和可视化的桌面应用程序。PyCharm是一种以Python为主要语言的集成开发环境(IDE),它提供了许多方便的工具和功能来帮助开发者更高效地编写和调试代码。 在Python3中,我们可以使用PyQt5来编写应用程序,包括调用摄像头进行图像采集和处理。通过调用PyQt5中的相机模块,我们可以访问计算机上的摄像头设备,并获取实时的图像数据。使用这些图像数据,我们可以进行各种图像处理操作,如图像增强、图像过滤、目标跟踪等。 为了更好地开发和调试Python应用程序,我们可以使用PyCharm作为开发工具。PyCharm提供了代码编辑器、调试器、版本控制集成等功能,可以提高开发效率和代码质量。在PyCharm中,我们可以轻松设置Python解释器,并导入所需的库和模块,以便使用PyQt5进行摄像头编程。 总结来说,Python3PyQt5和PyCharm可以一起使用来实现摄像头相关的应用程序Python3提供了强大的编程能力,PyQt5提供了访问和处理摄像头图像的功能,而PyCharm提供了开发工具和环境,使开发者可以更轻松地进行开发和调试工作。通过这些工具和技术,我们可以实现各种摄像头应用,如视频监控系统、人脸识别系统等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值