Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQT5:如何在QLabel小部件中交互式地绘制图像?_Python_Pyqt5_Qpainter_Qlabel_Qpixmap - Fatal编程技术网

Python PyQT5:如何在QLabel小部件中交互式地绘制图像?

Python PyQT5:如何在QLabel小部件中交互式地绘制图像?,python,pyqt5,qpainter,qlabel,qpixmap,Python,Pyqt5,Qpainter,Qlabel,Qpixmap,Python3,Mac OS Mojave上PyQt5的最新版本 我想要一个PyQt5程序,在该程序中,用户可以在图像上绘制连接的点(按不同的方式单击,点会自动连接)。重要的是,我只能在QLabel小部件(或替代小部件)中绘制图像,而不能在整个主窗口上绘制 我可以绘制图像并获得前两次单击的坐标,但当我想在图像上绘制时,它发生在图像下方。此外,我在获取坐标作为paintevent的输入时遇到困难 class Example(QWidget): def __init__(self):

Python3,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的新手,所以任何关于更高效代码的提示都是非常受欢迎的

试试看:

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小部件中,现在要绘制的图像分布在我的整个主窗口中+我不需要画笔,但可以单击并获得纠正的点(如绘制多边形)