本文通过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 nullpython3 + PyQt5图形项的自定义和交互python3实现页面设计师应用程序