python3 + PyQt5图形项的自定义和交互python3实现页面设计师应用程序

  

本文通过Python3 + PyQt5实现《python Qt Gui快速编程》这本书的页面设计师应用程序,采用QGraphicsView, QGraphicsScene, QGraphicsItem,这个程序包含有多个文,本图片和框的页面。有些图形类在PyQt5已过时,所以本代码改动幅度比较大。主要的类或方法的改变如下:
  

  
  

QMatrix==祝辞QTransform
  setMatrix==祝辞setTransform
  旋转==比;setRotation
  

     

本例中,由于event.delta()已过时,还重写了wheelEvent方法:

        def wheelEvent(自我、事件):   #系数=1.41 * * (-event.delta ()/240.0)   #系数=1.41 * * (abs (event.startX () -event.y ())/240.0)   .y因子=event.angleDelta () ()/120.0   如果event.angleDelta () .y()/120.0比;0:   因素=2   其他:   系数=0.5   自我。量表(因子,因子)   之前      

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

        类GraphicsPixmapItem (QGraphicsPixmapItem): # yangrongdong添加   def __init__(自我,象图):   超级(QGraphicsPixmapItem,自我). __init__(象图)   之前      

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

        如果文本==",对齐”:   菜单=QMenu(自我)   对于文本,arg (   (“对齐,左”,Qt.AlignLeft),   (Qt.AlignRight“对齐和权利”),   (Qt.AlignTop“对齐和顶级”),   (“对齐和底”,Qt.AlignBottom)):   包装器=functools.partial(自我。setAlignment arg)   self.wrapped.append(包装)   菜单。addAction(文本、包装)   button.setMenu(菜单)   之前      

本例中还针对QStyleOptionGraphicsItem。levelOfDetail已过时,改写如下:
  

  


  

  

下面为完整的代码:

        #?usr/bin/env python3         进口functools   进口随机   导入系统   从PyQt5。QtCore进口(QByteArray QDataStream、QFile QFileInfo,   QIODevice、QPoint QPointF QRectF, Qt)   从PyQt5。QtWidgets导入(QApplication QDialog,   QDialogButtonBox、QFileDialog QFontComboBox,   QGraphicsItem QGraphicsPixmapItem,   QGraphicsScene、QGraphicsTextItem QGraphicsView QGridLayout,   QHBoxLayout, QLabel、QMenu QMessageBox、QPushButton QSpinBox,   QStyle、QTextEdit QVBoxLayout)   从PyQt5。QtGui进口QFont、QCursor QFontMetrics、QTransform QPainter, QPen QPixmap   从PyQt5。QtPrintSupport进口QPrinter QPrintDialog      MAC=True   试一试:   从PyQt5。QtGui进口qt_mac_set_native_menubar   除了ImportError:   MAC=False      #页大?(595、842)# A4点   页大?(612、792)#我们信点   PointSize=10      MagicNumber=0 x70616765   FileVersion=1      脏=False         类TextItemDlg (QDialog):      def __init__(=没有自我,项=没有位置,现?None,父=None):   超级(QDialog,自我). __init__(父)      自我。项=项   自我。位置=位置   自我。现?场景      自我。编辑=QTextEdit ()   self.editor.setAcceptRichText(假)   self.editor.setTabChangesFocus(真正的)   editorLabel=QLabel(”和文本:“)   editorLabel.setBuddy (self.editor)   自我。fontComboBox=QFontComboBox ()   self.fontComboBox。setCurrentFont (QFont(“倍”,PointSize))   fontLabel=QLabel(“,字体:”)   fontLabel.setBuddy (self.fontComboBox)   自我。fontSpinBox=QSpinBox ()   self.fontSpinBox.setAlignment (Qt.AlignRight | Qt.AlignVCenter)   self.fontSpinBox。setRange (280)   self.fontSpinBox.setValue (PointSize)   fontSizeLabel=QLabel(",大小:")   fontSizeLabel.setBuddy (self.fontSpinBox)   自我。buttonBox=QDialogButtonBox (QDialogButtonBox.Ok |   QDialogButtonBox.Cancel)   self.buttonBox.button (QDialogButtonBox.Ok) .setEnabled(假)      如果自我。项不是没有:   self.editor.setPlainText (self.item.toPlainText ())   self.fontComboBox.setCurrentFont (self.item.font ())   .pointSize self.fontSpinBox.setValue (self.item.font () ())      布局=QGridLayout ()   布局。addWidget (editorLabel, 0, 0)   layout.addWidget(自我。编辑器,1,0,- 1,6)   布局。addWidget (fontLabel 2 0)   layout.addWidget(自我。fontComboBox、2、1、1、2)   布局。addWidget (fontSizeLabel、2、3)   layout.addWidget(自我。fontSpinBox、2、4、1、2)   layout.addWidget(自我。buttonBox 3 0 1 6)   self.setLayout(布局)         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)      自我。setWindowTitle (“Page Designer -{0}文本项”.format (   “添加”如果自我。项目没有别人“编辑”))   self.updateUi ()         def updateUi(自我):   字体=self.fontComboBox.currentFont ()   font.setPointSize (self.fontSpinBox.value ())   self.editor.document () .setDefaultFont(字体)   self.buttonBox.button QDialogButtonBox.Ok .setEnabled (   bool (self.editor.toPlainText ()))         def接受(自我):   如果自我。项目没有:   自我。项=TextItem(" ",自我。位置,self.scene)   字体=self.fontComboBox.currentFont ()   font.setPointSize (self.fontSpinBox.value ())   self.item.setFont(字体)   self.item.setPlainText (self.editor.toPlainText ())   self.item.update ()   全球脏   脏=True   QDialog.accept(自我)         类TextItem (QGraphicsTextItem):   def __init__(自我、文本位置,现场,   字体=QFont(“倍”,PointSize),矩阵=QTransform ()):   超级(TextItem,自我). __init__(文本)   self.setFlags (QGraphicsItem.ItemIsSelectable |   QGraphicsItem.ItemIsMovable)   self.setFont(字体)   self.setPos(位置)   self.setTransform(矩阵)   scene.clearSelection ()   scene.addItem(自我)   self.setSelected(真正的)   全球脏   脏=True         def parentWidget(自我):   返回self.scene () .views () [0]         def itemChange(自我,改变,变体):   如果改变!=QGraphicsItem.ItemSelectedChange:   全球脏   脏=True   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

python3 + PyQt5图形项的自定义和交互python3实现页面设计师应用程序