Python 如何正确缩放Graphicscene

Python 如何正确缩放Graphicscene,python,pyqt,pyqt5,qgraphicsview,qgraphicsscene,Python,Pyqt,Pyqt5,Qgraphicsview,Qgraphicsscene,我已经创建了一个小应用程序,我正在尝试使其在主窗口调整大小(GraphicsView和场景也调整大小)时,整个场景(pixmap和矩形)垂直缩放,以完全适合GraphicsView。我不想要一个垂直的滚动条,也不想要它水平缩放 我不知道如何正确地缩放场景。我使用Graphicscene包含一个图形和一对垂直矩形“标记”。当我可以通过重新绘制pixmap并重新附着它来缩放图形以适应时,z顺序是错误的,并且矩形小部件不能用它来缩放 我需要跟踪矩形小部件,所以我不能一直删除和重新添加它们,因为每个小部

我已经创建了一个小应用程序,我正在尝试使其在主窗口调整大小(GraphicsView和场景也调整大小)时,整个场景(pixmap和矩形)垂直缩放,以完全适合GraphicsView。我不想要一个垂直的滚动条,也不想要它水平缩放

我不知道如何正确地缩放场景。我使用Graphicscene包含一个图形和一对垂直矩形“标记”。当我可以通过重新绘制pixmap并重新附着它来缩放图形以适应时,z顺序是错误的,并且矩形小部件不能用它来缩放

我需要跟踪矩形小部件,所以我不能一直删除和重新添加它们,因为每个小部件都有元数据

我知道fitInView(从这里:)适用于包含的GraphicsView,但我不明白为什么它需要一个参数。我只是想让场景适应GraphicsView(垂直但不是水平),那么GraphicsView为什么不缩放场景中的所有内容以适应其当前大小呢?要使场景垂直适合,参数应该是什么样的

在resizeEvent中,我可以重新绘制pixmap并重新添加,但由于z顺序混乱,它会覆盖矩形。而且,它不会在场景中垂直居中,我需要复制元数据

导入系统 导入操作系统 从PyQt5导入QtCore、QtGui、QtWidgets 将PyQt5导入为qt 从PyQt5.QtGui导入QColor 从PyQt5.QtCore导入Qt,QPoint 从PyQt5.qtwidts导入QApplication、QWidget、QPushButton、QHBoxLayout、QGroupBox、QDialog、QVBoxLayout 从PyQt5.QtWidgets导入QVBoxLayout、QGridLayout、QStackedWidget、QTabWidget 将numpy作为np导入 类graphicscene(qtwidts.qgraphicscene): def uuu init uuu(self,parent=None): super(graphicscene,self)。\uuuu init\uuuu(父级) def最小尺寸(自身): 返回QtCore.QSize(300200) def dragMoveEvent(自身,事件): 打印(“dragMoveEvent”,事件) 类MainWindow(QtWidgets.QMainWindow): def uuu init uuu(self,parent=None): 超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级) #超级(主窗口)。\uuuu初始化 layout=QVBoxLayout() layout.setContentsMargins(0,0,0,0) 最大x,最大y=2400700 最大x_视图=1200 self.max\u x=max\u x self.max\u y=max\u y self.first=True self.setGeometry(200,200,max_x_视图,self.max_y) self.gv=qtwidts.QGraphicsView(self) self.gv.setGeometry(0,0,max_x_视图,self.max_y) self.gv2=qtwidts.QGraphicsView(self) layout.addWidget(self.gv) layout.addWidget(self.gv2) 场景=graphicscene() self.scene=场景 self.gv.setScene(场景) tab_widget=QTabWidget() tab_widget.setTabPosition(QTabWidget.West) widget=QWidget() widget.setLayout(布局) tab_widget.addTab(widget,“main”) self.setCentralWidget(选项卡小部件) np.随机种子(777) self.x_time=np.linspace(0,12.563000) 随机数据=np.随机.均匀(0.0,1.0,3000) self.data=.45*(np.sin(2*self.x_时间)+rand_数据)-.25*(np.sin(3*self.x_时间)) self.first=True pixmap_height=max_y//2-2*22#22以考虑滚动条的高度 pixmap=self.draw_graph() pen=QtGui.QPen() 笔设置宽度(2) pen.setColor(QtGui.QColor(“红色”)) self.gv1_pixmap=scene.addPixmap(pixmap) rect=scene.scene() 打印(“场景矩形={}”。格式(矩形)) 场景。设置为竖立(矩形) 侧面,偏移量=50200 对于范围(2)中的i: r=QtCore.QRectF(QtCore.QPointF((i+1)*偏移量+i*2*边,2),QtCore.QSizeF(边,像素高度-4)) rect_ref=scene.addRect(r,pen,QColor(255,0,0,127)) rect_ref.setFlag(qtwidts.QGraphicsItem.ItemIsMovable) 所有项目=场景。项目() 打印(所有项目) def绘制图形(自): 打印(“绘制图形:主窗口大小{}:”.format(self.size())) pixmap#u height=self.height()//2-2*22#22以确定滚动条的高度 x_final=self.x_时间[-1] 数据=self.data/np.max(np.abs(self.data)) 数据=[abs(int(k*pixmap_height))表示自我数据中的k] x_pos=[int(self.x_time[i]*self.max_x/x_final)表示范围内的i(len(data))] pixmap=QtGui.QPixmap(self.max\u x,pixmap\u height) painter=QtGui.QPainter(pixmap) pen=QtGui.QPen() 笔设置宽度(2) rect=pixmap.rect() pen.setColor(QtGui.QColor(“红色”)) 画师:drawRect(rect) 打印(“pixmap rect={}”.format(rect)) painter.fillRect(rect,QtGui.QColor('lightblue')) 笔设置宽度(2) pen.setColor(QtGui.QColor(“绿色”)) 画师:画笔 对于zip中的x,y(x_位置,数据): 绘制线(x,像素点高度,x,像素点高度-y) (完) 返回pixmap def resizeEvent(self,a0:QtGui.QResizeEvent): #打印(“主窗口大小调整事件”) 打印(“主窗口大小{}:”.format(a0.size())) 重画=假 如果重新绘制: pixmap=self.draw_graph() self.scene.removietem(self.gv1_pixmap) self.gv1_pixmap=self.scene.addPixmap(pixmap) self.gv1_pixmap.moveBy(0,30) 其他: #rect=QtCore.QRect(self.gv.startPos,self.gv.endPos) #scen直立=self.gv.maptosene(rect).boundingRect() #打印“选定区域:视口坐标:”,矩形,”,场景坐标:”,场景竖立 #自gv.FITIVIEW(场景竖立) 通过 app=qtwidts.QApplication(sys.argv) 窗口=主窗口() window.show() app.exec()
我的解决方案将适合将所有项目(场景)封装到QGraphicsView视口的最小矩形的高度。因此,设置的高度