Qpainter Draw Line Between Two Widgets
I have a layout, and I am going to add a button to this layout (by clicking on the add button).  Everytime I add a button, I wanna draw a line between Previous button and new butto
Solution 1:
The logic is similar: Trace the events and changes (such as creating and destroying widgets) and then use the information to get the information to draw the lines:
import functools
import sys
from PyQt5.QtCore import QEvent, QLine
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
class Drawer:
    def __init__(self):
        self._lines = []
    @property
    def lines(self):
        return self._lines
    @lines.setter
    def lines(self, l):
        self._lines = l[:]
        self.update()
    def paintEvent(self, event):
        painter = QPainter(self)
        for line in self.lines:
            painter.drawLine(line)
class Example(QWidget, Drawer):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()
    def initUI(self):
        self.AddButton = QPushButton("Add")
        self.AddButton.clicked.connect(self.addbuttonwithline)
        self.vbox = QVBoxLayout(self)
        self.vbox.addWidget(self.AddButton)
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle("Buttons")
        self.buttons = []
    def addbuttonwithline(self):
        button = QPushButton("delete")
        button.clicked.connect(functools.partial(self.remove_button, button))
        button.installEventFilter(self)
        self.vbox.addWidget(button)
        self.buttons.append(button)
        self.recalculate_position()
    def remove_button(self, button):
        self.buttons.remove(button)
        button.deleteLater()
        self.recalculate_position()
    def recalculate_position(self):
        lines = []
        for last_button, next_button in zip(self.buttons, self.buttons[1:]):
            l = QLine(last_button.pos(), next_button.pos())
            lines.append(l)
        self.lines = lines
    def eventFilter(self, o, e):
        if e.type() == QEvent.Move and o in self.buttons:
            self.recalculate_position()
        return super().eventFilter(o, e)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
Post a Comment for "Qpainter Draw Line Between Two Widgets"