Skip to content Skip to sidebar Skip to footer

Pyqt5 Draw A Line Between Two Widgets

I am trying to use QPainter to draw a line between two widgets. If I use a simple function inside the first class it works. But, I want to create a separate class of a QPainter eve

Solution 1:

Widgets can only be painted in the widget's paintEvent method, so if you don't want to paint it in the same class then you can use multiple inheritance. On the other hand, the initial positions you use to paint will be the positions before showing that they are 0 making no line is painted but a point so it is better to track the positions using an event filter.

import sys

from PyQt5.QtCore import QEvent
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget


class Drawer:
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawLine(self.p1, self.p2)


class Example(QWidget, Drawer):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        self.okButton = QPushButton("OK")
        self.cancelButton = QPushButton("Cancel")

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.okButton)
        vbox.addWidget(self.cancelButton)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle("Buttons")

        self.p1, self.p2 = self.okButton.pos(), self.cancelButton.pos()

        self.okButton.installEventFilter(self)
        self.cancelButton.installEventFilter(self)

    def eventFilter(self, o, e):
        if e.type() == QEvent.Move:
            if o is self.okButton:
                self.p1 = self.okButton.pos()
            elif o is self.cancelButton:
                self.p2 = self.cancelButton.pos()
            self.update()
        return super().eventFilter(o, e)


if __name__ == "__main__":

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

Post a Comment for "Pyqt5 Draw A Line Between Two Widgets"