首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyqt5在两个小部件之间画一条线

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

Stack Overflow用户
提问于 2019-12-08 19:02:26
回答 1查看 513关注 0票数 1

我正在尝试使用QPainter在两个小部件之间划清界限。如果我在第一个类中使用一个简单的函数,它就可以工作。但是,我想创建一个单独的QPainter事件类,我可以随时在第一个类调用它。但是,它并没有像预期的那样工作。你能帮我弄清楚为什么QPainter类没有添加一行吗?

代码语言:javascript
运行
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-09 01:46:30

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

代码语言:javascript
运行
复制
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_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59234724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档