我在一个QWidget中使用QVBoxLayout,放入QGRaphicsView和QGRaphicsScene,然后想在指定坐标点画图,但layout会自动将图显示在界面正中央,指定的坐标不起作用。如何破解?代码如下:
from PySide6.QtWidgets import QWidget, QPushButton, QGraphicsView, QGraphicsScene, QGraphicsEllipseItem,QVBoxLayout
from PySide6.QtGui import QPen, QBrush, QColor,QPainter
from PySide6.QtCore import Qt, QRectF, QPointF
class GraphicsView(QGraphicsView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setRenderHints(QPainter.Antialiasing) # 开启抗锯齿
# self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
#self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设置主窗口的大小
self.resize(420, 370)
self.layout = QVBoxLayout()
# 创建 QGraphicsView 和 QGraphicsScene
self.scene = QGraphicsScene()
self.view = GraphicsView(self.scene, self)
self.view.setGeometry(10, 10, 400, 300) # 设置视图的位置和大小
# 将 QGraphicsView 添加到布局中
self.layout.addWidget(self.view)
# 创建按钮
self.add_button = QPushButton("Add Circle", self)
self.add_button.setGeometry(10, 320, 100, 30) # 设置按钮的位置和大小
self.remove_button = QPushButton("Remove Circle", self)
self.remove_button.setGeometry(120, 320, 120, 30) # 设置按钮的位置和大小
# 连接按钮点击事件
self.add_button.clicked.connect(self.add_circle)
self.remove_button.clicked.connect(self.remove_circle)
# 初始化圆圈变量
self.circle = None
def add_circle(self):
rect = QRectF(100, 40, 10, 10)
self.circle = self.scene.addEllipse(rect, QPen(Qt.black))
# 在add_circle方法中添加以下代码
self.view.setSceneRect(self.scene.itemsBoundingRect()) # 设置场景矩形
self.view.centerOn(0, 0) # 将视图中心设置为场景的原点
def remove_circle(self):
# 删除圆圈
if self.circle is not None:
self.scene.removeItem(self.circle)
self.circle = None
if __name__ == "__main__":
from PySide6.QtWidgets import QApplication
app = QApplication([])
main_window = MyWidget()
main_window.show()
app.exec()
相似问题