在pictu上绘制选择矩形

2024-09-28 19:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何单击并在用户加载的图片上绘制一个矩形。我发现了一些我试图遵循的例子,但似乎没有任何效果,我不确定为什么或如何着手修复它。在

我添加了一些断点,但它似乎没有进入mouseMoveEvent函数,但我不确定原因。任何帮助都将不胜感激。在

我想要什么

我希望能够单击并拖动加载到QGraphics中的图片,并让它绘制一个框,然后在状态栏中输出矩形两点的X和Y坐标。我也希望矩形停留在那里,直到用户第二次点击图片。在

我发现的例子

What I would like

Simple example

当前代码

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)
        self.setUpMainUiFunction()

    def setUpMainUiFunction(self):
        self.actionOpen.triggered.connect(self.OpenDialog)
        self.Button_LoadPhoto.clicked.connect(self.OpenDialog)

        open = QAction(QIcon("icons/open.bmp"), "open", self)
        save = QAction(QIcon("icons/save.bmp"), "save", self)
        NormalCursor = QAction(QIcon("icons/cursor-normal.png"), "NormalCursor", self)
        CrosshairCursor = QAction(QIcon("icons/crosshair.png"), "CrosshairCursor", self)

        self.TopToolBar.addAction(open)
        self.TopToolBar.addAction(save)
        self.LeftToolBar.addAction(NormalCursor)
        self.LeftToolBar.addAction(CrosshairCursor)

        # self.TopToolBar.actionTriggered[QAction].connect(self.toolbtnpressed)

    def OpenDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        PicturePath = QStandardPaths.standardLocations(QStandardPaths.PicturesLocation)[0]
        filenames, _ = QFileDialog.getOpenFileNames(self, "Open File", PicturePath, "JPEG File (*.png)", options=options)
        for filename in filenames:
            pixmap = QPixmap(filename)
            self.showPicture(pixmap)
            self.statusbar.showMessage("Successfully Loaded: {}".format(filename))

    def showPicture(self, picture):
        sub = QMdiSubWindow(self)
        loadPicture = LoadPicture(picture, sub)
        sub.setWidget(loadPicture)
        sub.setObjectName("Load_Picture_window")
        sub.setWindowTitle("New Photo")
        self.mdiArea.addSubWindow(sub)
        sub.show()
        sub.resize(picture.size())
        loadPicture.log.MousePixmapSignal.connect(self.updatePixel)

    def updatePixel(self, point, color):
        self.UserInput_PixelValue_X.setText("{}".format(point.x()))
        self.UserInput_PixelValue_Y.setText("{}".format(point.y()))

        self.UserInput_PixelValue_R.setText("{}".format(color.red()))
        self.UserInput_PixelValue_G.setText("{}".format(color.green()))
        self.UserInput_PixelValue_B.setText("{}".format(color.blue()))

这是在一个seprate文件中。在

^{pr2}$

Tags: selfformatsavedefconnectopencoloroptions
1条回答
网友
1楼 · 发布于 2024-09-28 19:19:30

为了实现此功能,我们必须重写QGraphicsView的mouseMoveEvent、mousePressEvent、mouseReleaseEvent方法,为此我们创建以下文件:

QGraphicsView.py

class GraphicsView(QGraphicsView):
    rectChanged = pyqtSignal(QRect)

    def __init__(self, *args, **kwargs):
        QGraphicsView.__init__(self, *args, **kwargs)
        self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
        self.setMouseTracking(True)
        self.origin = QPoint()
        self.changeRubberBand = False

    def mousePressEvent(self, event):
        self.origin = event.pos()
        self.rubberBand.setGeometry(QRect(self.origin, QSize()))
        self.rectChanged.emit(self.rubberBand.geometry())
        self.rubberBand.show()
        self.changeRubberBand = True
        QGraphicsView.mousePressEvent(self, event)

    def mouseMoveEvent(self, event):
        if self.changeRubberBand:
            self.rubberBand.setGeometry(QRect(self.origin, event.pos()).normalized())
            self.rectChanged.emit(self.rubberBand.geometry())
        QGraphicsView.mouseMoveEvent(self, event)

    def mouseReleaseEvent(self, event):
        self.changeRubberBand = False
        QGraphicsView.mouseReleaseEvent(self, event)

此类必须在GraphicsArea中使用_图形用户界面.py为此,我们更改了以下内容:

^{pr2}$

收件人:

from GraphicsView import GraphicsView
[...]
self.PictureArea = GraphicsView(self.scrollAreaWidgetContents)

初始类使用一个QRubberBand来更新它的几何结构,当你想要左上角的位置时,右下角我们发出一个由相关QRect发送的信号,这个信号连接到一个插槽。在

    [...]
    loadPicture.log.MousePixmapSignal.connect(self.updatePixel)
    loadPicture.PictureArea.rectChanged.connect(self.onRectChanged)

def onRectChanged(self, r):
    topLeft = r.topLeft()
    bottomRight = r.bottomRight()
    print(topLeft.x(), topLeft.y(), bottomRight.x(), bottomRight.y())

相关问题 更多 >