【问题标题】:How to draw a line from mouse to a point in PyQt5?如何在 PyQt5 中从鼠标到点画一条线?
【发布时间】:2017-06-02 07:44:02
【问题描述】:

这是我的代码:

import sys
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget)
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt

class MouseTracker(QWidget):
    distance_from_center = 0
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setMouseTracking(True)

    def initUI(self):
        self.setGeometry(200, 200, 1000, 500)
        self.setWindowTitle('Mouse Tracker')
        self.label = QLabel(self)
        self.label.resize(500, 40)
        self.show()

    def mouseMoveEvent(self, event):
        distance_from_center = round(((event.y() - 250)**2 + (event.x() - 500)**2)**0.5)
        self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()) + "Distance from center: " + str(distance_from_center))       

        q = QPainter()  #Painting the line
        q.begin(self)
        q.drawLine(event.x(), event.y(), 250, 500)
        q.end()

    def drawPoints(self, qp, x, y):
        qp.setPen(Qt.red)
        qp.drawPoint(x, y)

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

我正在尝试使用以下方法从鼠标位置到小部件中间绘制一条简单的线:

        q = QPainter()  #Painting the line
        q.begin(self)
        q.drawLine(event.x(), event.y(), 250, 500)
        q.end()

但是当我运行它时,看不到任何线条。我需要做什么?

【问题讨论】:

    标签: python qt python-3.x pyqt pyqt5


    【解决方案1】:

    对于上一个答案,我在Python3.7和PyQt5下试过。结果是程序崩溃 '进程以退出代码 -1073740791 (0xC0000409) 结束'。 在 cmets 中,还有其他人也提到了坠机事件。 我找到了解决此崩溃的方法: self.x 和 self.y 必须在调用 self.show() 之前初始化 于是我简单地修改了代码如下:

    def initUI(self):
        self.setGeometry(200, 200, 1000, 500)
        self.setWindowTitle('Mouse Tracker')
        self.label = QLabel(self)
        self.label.resize(500, 40)
        self.x = 100
        self.y = 100
        self.show()
    

    【讨论】:

      【解决方案2】:

      您只能在paintEvent 方法中使用QPainter。所以修复的一种方法是在类中记录 x 和 y 坐标并更新根小部件。然后调用paintEvent,你会看到这条线。

      例子

      import sys
      from PyQt5.QtWidgets import QApplication, QLabel, QWidget
      from PyQt5.QtGui import QPainter
      from PyQt5.QtCore import Qt
      
      class MouseTracker(QWidget):
          distance_from_center = 0
          def __init__(self):
              super().__init__()
              self.initUI()
              self.setMouseTracking(True)
              self.x = -1
              self.y = -1
      
          def initUI(self):
              self.setGeometry(200, 200, 1000, 500)
              self.setWindowTitle('Mouse Tracker')
              self.label = QLabel(self)
              self.label.resize(500, 40)
              self.show()
      
          def paintEvent(self, e):
      
              if not (self.x == -1 or self.y == -1):
                  q = QPainter()  #Painting the line
      
                  q.begin(self)
      
                  q.drawLine(self.x, self.y, 250, 500)
                  q.end()
      
          def mouseMoveEvent(self, event):
              distance_from_center = round(((event.y() - 250)**2 + (event.x() - 500)**2)**0.5)
              self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()) + "Distance from center: " + str(distance_from_center))
      
              self.x = event.x()
              self.y = event.y()
      
              self.update()
      
          def drawPoints(self, qp, x, y):
              qp.setPen(Qt.red)
              qp.drawPoint(x, y)
      
      app = QApplication(sys.argv)
      ex = MouseTracker()
      sys.exit(app.exec_())
      

      我不确定最初将如何设置 self.xself.ypaintEvent 中的 -1 和检查感觉有点 hacky,但至少它可以绘画。

      【讨论】:

      • 每当我定义paintEvent时它都会崩溃,即使我完全复制了你的代码。有什么想法吗?
      • 我没有遇到任何崩溃。看来你还是解决了。
      【解决方案3】:

      你必须实现函数QPaintEvent,在这个函数中你必须画线,另外你必须调用函数update()来更新绘图。

      import sys
      from PyQt5.QtWidgets import (QApplication, QLabel, QWidget)
      from PyQt5.QtGui import QPainter, QColor, QPen
      from PyQt5.QtCore import Qt
      
      class MouseTracker(QWidget):
          distance_from_center = 0
          def __init__(self):
              super().__init__()
              self.initUI()
              self.setMouseTracking(True)
      
          def initUI(self):
              self.setGeometry(200, 200, 1000, 500)
              self.setWindowTitle('Mouse Tracker')
              self.label = QLabel(self)
              self.label.resize(500, 40)
              self.show()
              self.pos = None
      
          def mouseMoveEvent(self, event):
              distance_from_center = round(((event.y() - 250)**2 + (event.x() - 500)**2)**0.5)
              self.label.setText('Coordinates: ( %d : %d )' % (event.x(), event.y()) + "Distance from center: " + str(distance_from_center))       
              self.pos = event.pos()
              self.update()
      
          def paintEvent(self, event):
              if self.pos:
                  q = QPainter(self)
                  q.drawLine(self.pos.x(), self.pos.y(), 250, 500)
      
      
      app = QApplication(sys.argv)
      ex = MouseTracker()
      sys.exit(app.exec_())
      

      输出:

      【讨论】:

      • 当我尝试这样做时它崩溃了,有什么想法吗?
      • 将位置变量移动到方法之外,在 distance_from_center 旁边使它对我有用。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多