2017-01-18 140 views
0

这里是我的代码:如何绘制一条从鼠标到PyQt5中某一点的直线?

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() 

但是,当我运行它,没有线是可见的。我需要做什么?

回答

1

您必须执行功能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_()) 

输出:

enter image description here

+0

当我试图做到这一点时,它会崩溃,有什么想法? – Kos

+0

将position变量移动到方法外部,distance_from_center旁边使它适用于我。谢谢! – Kos

0

您只能使用一个QPainterpaintEvent方法内。所以解决的一个方法是在类中记录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.y将初始设置。 -1和paintEvent中的支票感觉有点不好意思,但至少它是油漆。

+0

无论何时定义paintEvent,即使我精确地复制代码,它都会崩溃。有任何想法吗? – Kos

+0

我没有得到任何崩溃。无论如何,似乎你已经解决了它。 –

相关问题