使用 QPainter 更改线条的位置

Posted

技术标签:

【中文标题】使用 QPainter 更改线条的位置【英文标题】:Changing the position of a line using QPainter 【发布时间】:2012-11-14 13:44:46 【问题描述】:

我有一个带按钮的窗口。单击按钮后,我想更改最初绘制的线条的位置。这是我到目前为止的代码。

import sys 
from PyQt4 import QtGui , QtCore

class trial(QtGui.QWidget):
    def __init__(self):
        super(trial , self).__init__()
        self.window()

    def window(self):
        self.a = 0
        button = QtGui.QPushButton('Push')
        button.setCheckable(True)
        button.clicked.connect(self.fun)
        grid = QtGui.QGridLayout()
        grid.addWidget(button , 0 , 0)
        self.setLayout(grid)
        self.setWindowTitle('Trial')
        self.setGeometry(500 , 500 , 500 , 500)
        self.show()

    def fun(self , text):
        if text == 1:
            self.a = 0

        else:
            self.a = 1


    def paintEvent(self , e):
        qp = QtGui.QPainter()
        qp.begin(self)
        pen = QtGui.QPen(QtCore.Qt.red , 5 , QtCore.Qt.SolidLine)
        qp.setPen(pen)

        if self.a == 0:

            qp.drawLine(20 , 20 , 20 , 480)
        else:
            qp.drawLine(480 , 20 , 480 , 480) 
        qp.end()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    t = trial()
    sys.exit(app.exec_())

我知道我的代码看起来有点笨拙,但我面临以下问题。 1. 按下按钮后,线的位置变化需要相当长的时间。

2.还有怎么揉之前画的线。

如果有人能帮我修改代码就好了。谢谢。

【问题讨论】:

【参考方案1】:

1) 在fun() 函数中添加对self.update() 的调用,让Qt 知道您的小部件需要重绘

2)(对python语法不太清楚,所以我会用C++举例)

您可以在您的绘制事件中显式绘制背景:

qp.setBrush( Qt::white );  // Or whatever color you want the background to be 
qp.drawRect( rect() );

或者你可以试试QWidget::setAutoFillBackground()

【讨论】:

以上是关于使用 QPainter 更改线条的位置的主要内容,如果未能解决你的问题,请参考以下文章

油漆事件外的QPainter画家对象

Qt的paint函数重写,以及QPaint给一条线绘制箭头

如何销毁 QPainter 对象/摆脱 drawText() 内存泄漏?

派生QPainterPath,QPainter性能下降很快

利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

QGuiApplication没有显示使用QPainter和QPdfWriter