Pyqt5在两个小部件之间画一条线

时间:2019-12-08 11:02:25

标签: python pyqt5

我正在尝试使用QPainter在两个小部件之间画一条线。如果我在第一个类中使用一个简单的函数,它将起作用。但是,我想创建一个QPainter事件的单独的类,可以随时在第一类中调用它。但是,它没有按预期工作。您能帮我弄清楚为什么QPainter类没有添加行吗?

import sys
from PyQt5.QtGui     import *
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import *

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.okButton = QPushButton("OK")
        self.cancelButton = QPushButton("Cancel")

        l1 = self.okButton.pos()
        l2 = self.cancelButton.pos()

        # This is to call the class to draw a line between those two widgets
        a = QPaint(l1.x(), l1.y(), l2.x(), l2.y(),parent=self)

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

        self.setLayout(vbox)    

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Buttons')    
        self.show()


class QPaint(QPainter):
    def __init__(self, x1, y1, x2, y2, parent=None):
        super().__init__()

    def paintEvent(self, event):

        self.setPen(Qt.red)

        self.drawLine(x1,y1,x2,y2)


if __name__ == '__main__':

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

1 个答案:

答案 0 :(得分:1)

窗口小部件只能在窗口小部件的paintEvent方法中绘制,因此,如果您不想在同一类中绘制它,则可以使用多重继承。另一方面,用于绘制的初始位置将是显示它们为0之前的位置,从而不绘制线,而是绘制一个点,因此最好使用事件过滤器来跟踪位置。

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