【问题标题】:Can't stop drawing rectangles in qgraphicsview无法停止在 qgraphicsview 中绘制矩形
【发布时间】:2019-08-26 18:19:40
【问题描述】:

在我的程序中,我可以选择一个设置 self.rectmode=1 的按钮。一旦该变量设置为 1,它就会使用 qgraphicsview 上的鼠标事件绘制矩形。按下按钮设置 self.rectmode=0 后,程序继续使用鼠标事件绘制矩形。我是否缺少一些线来结束矩形绘图事件。我的代码在下面提前感谢:

def mousePressEvent(self, event):

    if (self.rectmode==1 and event.button() == Qt.LeftButton and not  self._photo.pixmap().isNull()):
        self.origin = event.pos()
        self.rubberBand.setGeometry(QRect(self.origin, QSize()))
        self.rectChanged.emit(self.rubberBand.geometry())
        self.rubberBand.show()
        self.changeRubberBand = True

     else:
        super(PhotoViewer, self).mousePressEvent(event)

def mouseMoveEvent(self, event):

    if self.rectmode==1 and self.changeRubberBand:
        self.rubberBand.setGeometry(QRect(self.origin, event.pos()).normalized())
        self.rectChanged.emit(self.rubberBand.geometry())

    else:
        super(PhotoViewer, self).mouseMoveEvent(event)

def mouseReleaseEvent(self, event):

    if self.rectmode==1 and event.button() == Qt.LeftButton:
        self.changeRubberBand = False
        self.endpoint = event.pos()
        print(self.origin.x())
        print(self.origin.y())
        print(self.endpoint.x())
        print(self.endpoint.y())

    else:
        super(PhotoViewer, self).mouseReleaseEvent(event)

【问题讨论】:

  • 从您的摘录中可以看出,一切都应该按预期工作。也许有一些你没有考虑到的变量设置。您能否扩展您的代码以使其更全面和可重现(同时保持最少)?

标签: python pyqt5 rectangles


【解决方案1】:

在您的代码中 rectmode 始终为 1,我认为这是导致问题的原因,这是一个工作示例,我还删除了变量 changeRubberBand,因为仅使用变量 rectMode 可以实现相同的效果:

import sys

from PyQt5.Qt import QApplication, QRect, QSize, Qt, QRubberBand, QVBoxLayout, pyqtSignal
from PyQt5.QtWidgets import QMainWindow


class PhotoViewer(QMainWindow):
    rectChanged = pyqtSignal(QRect)

    def __init__(self):
        super().__init__()
        self.origin = None
        self.endpoint = None
        self.rectMode = 0

        self.setFixedSize(1024, 768)
        self.layout = QVBoxLayout(self)

        self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
        self.rubberBand.hide()
        self.layout.addChildWidget(self.rubberBand)

    def mousePressEvent(self, event):
        if self.rectMode == 0 and event.button() == Qt.LeftButton:
            self.origin = event.pos()
            self.rubberBand.setGeometry(QRect(self.origin, QSize()))
            self.rectChanged.emit(self.rubberBand.geometry())
            self.rubberBand.show()
            self.rectMode = 1
        else:
            super(PhotoViewer, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.rectMode == 1:
            self.rubberBand.setGeometry(QRect(self.origin, event.pos()).normalized())
            self.rectChanged.emit(self.rubberBand.geometry())

        else:
            super(PhotoViewer, self).mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        if self.rectMode == 1 and event.button() == Qt.LeftButton:
            self.rectMode = 0
            self.endpoint = event.pos()
            print(self.origin.x())
            print(self.origin.y())
            print(self.endpoint.x())
            print(self.endpoint.y())

        else:
            super(PhotoViewer, self).mouseReleaseEvent(event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = PhotoViewer()
    mainWindow.show()
    sys.exit(app.exec_())

希望对你有帮助。

【讨论】:

  • 你是对的,我的一个按钮有问题关闭了矩形模式。我解决了这个问题,现在它可以正常关闭了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2014-01-13
  • 2019-09-01
  • 2015-08-28
相关资源
最近更新 更多