【问题标题】:PyQT5: How to interactively paint on image within QLabel Widget? [duplicate]PyQT5:如何在 QLabel Widget 中以交互方式绘制图像? [复制]
【发布时间】:2018-10-21 14:02:46
【问题描述】:

Python 3,Mac OS Mojave 上最新版本的 PyQt5

我想要一个 PyQt5 程序,其中用户可以在图像上绘制连接的点(有区别地单击,这些点会自动连接)。重要的是,我只能在 QLabel 小部件(或替代小部件)中绘制图像,而不能在整个主窗口上绘制。

我可以绘制图像并获取前两次单击的坐标,但是当我想在图像上绘画时,它发生在图像下方。此外,我在获取坐标作为我的paintevent的输入时遇到了麻烦。

class Example(QWidget):

   def __init__(self):

      super().__init__()


      title = "Darcy"
      top = 400
      left = 400
      width = 550
      height = 600

      self.clickcount = 0
      self.x = 0
      self.y = 0



      self.setWindowTitle(title)
      self.setGeometry(top,left, width, height)

      self.initUI()

  def paintEvent(self, e):

      qp = QPainter()
      qp.begin(self)
      self.drawLines(qp)
      qp.end()


  def drawLines(self, qp):

      pen = QPen(Qt.black, 2, Qt.SolidLine)

      qp.setPen(pen)
      qp.drawLine(20, 40, 250, 40)

  def initUI(self):

      self.map = QLabel()
      Im = QPixmap("GM_loc.png")
      Im = Im.scaled(450,450)
      self.map.setPixmap(Im)

      self.loc = QLabel()
      self.test = QLabel()

      self.map.mousePressEvent = self.getPos



      #organize in grid
      grid = QGridLayout()
      grid.setSpacing(10)

      grid.addWidget(self.map, 0, 0)
      grid.addWidget(self.loc,1,0)
      grid.addWidget(self.test,2,0)

      self.setLayout(grid)
      self.show()


  def getPos(self , event):

      self.clickcount += 1

      self.x_old = self.x
      self.y_old = self.y

      self.x = event.pos().x()
      self.y = event.pos().y() 


      self.loc.setText("x = "+str(self.x)+" & y= "+str(self.y)+" & old x = " + str(self.x_old) + " & old y = " + str(self.y_old))


 if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 

提前致谢! PS 我是 PyQt5 的新手,所以任何关于更高效代码的提示都非常受欢迎!

【问题讨论】:

    标签: python pyqt5 qpainter qlabel qpixmap


    【解决方案1】:

    试试看:

    import sys
    from PyQt5.QtCore    import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui     import *
    
    class MyScribbling(QMainWindow):
        def __init__(self):
            super().__init__()
            self.penOn = QAction(QIcon('Image/ok.png'), 'ON   drawing', self)
            self.penOn.triggered.connect(self.drawingOn)
            self.penOff = QAction(QIcon('Image/exit.png'), 'OFF drawing', self)
            self.penOff.triggered.connect(self.drawingOff)
            toolbar = self.addToolBar('Tools')
            toolbar.addAction(self.penOn)
            toolbar.addAction(self.penOff)
    
            self.scribbling = False
            self.myPenColor = Qt.red      
            self.myPenWidth = 3           
    
            self.lastPoint = QPoint()
            self.image     = QPixmap("Image/picture.png")
            self.setFixedSize(600, 600)
            self.resize(self.image.width(), self.image.height())
            self.setWindowTitle("drawing On / Off")
    
        def paintEvent(self, event):
            painter = QPainter(self)
            painter.drawPixmap(self.rect(), self.image)
    
        def mousePressEvent(self, event):
            if (event.button() == Qt.LeftButton) and self.scribbling: 
                self.lastPoint = event.pos()
    
        def mouseMoveEvent(self, event):
            if (event.buttons() & Qt.LeftButton) and self.scribbling:
                painter = QPainter(self.image)
                painter.setPen(QPen(self.myPenColor, self.myPenWidth, 
                                    Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                painter.drawLine(self.lastPoint, event.pos())
                self.lastPoint = event.pos()
                self.update()
    
        def drawingOn(self):
            self.scribbling = True
    
        def drawingOff(self):
            self.scribbling = False
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = MyScribbling()
        ex.show()
        sys.exit(app.exec_())        
    

    【讨论】:

    • 请不要多次发布相同的答案,如果两个问题的答案相同则意味着问题重复,您应该将其标记为正确。
    • 您好,感谢您的帮助,但这并不能解决我的问题。重要的是它仍然在 QLabel 小部件中,现在要绘制的图像遍布我的整个主窗口 + 我不需要画笔,但可以单击并获取更正的点(如绘制多边形)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2013-05-01
    • 2020-11-04
    • 2017-12-19
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多