2017-01-18 139 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

我沒有得到任何崩潰。無論如何,似乎你已經解決了它。 –

相關問題