在PyQt

时间:2015-05-21 10:51:51

标签: python pyqt qtextedit paintevent

我正在尝试开发一个包含QTextEdit小部件的GUI。当gui加载时,它从文件中提取数据,其中数据是固定宽度的列。

我希望用户能够在QTextEdit小部件中的各个点处单击,以标记新列开始的位置,并且我希望在这些位置的小部件上绘制垂直线,以显示列。 / p>

在我的GUI init ()方法中,我使用以下行拦截文本小部件中的paintEvent:

self.mytextviewer.paintEvent = self.handlePaintEvent

我有一个handlePaintEvent()方法:

def handlePaintEvent(self, event):
    painter = QPainter(self.mytextviewer)
    pen = QPen(Qt.SolidLine)
    pen.setColor(Qt.black)
    pen.setWidth(1)
    painter.setPen(pen)
    painter.drawLine(20, 0, 20, 100)

然而,当我试图运行代码时,我开始得到关于画家没有活动的QPainter错误。

然后我尝试了另一个方向,继承QTextEdit并将基本相同的代码添加到我的子类的paintEvent()方法中。但是我仍然遇到错误。

然后我尝试将painter.begin(self)painter.end()添加到paintEvent()方法中,但对此也没有任何乐趣。

此外,由于我添加了自定义的paintEvent()方法,因此不再显示最初显示在窗口小部件中的文本。

我在这里做了一些非常愚蠢的事情,还是有更好/更容易的方法来解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:1)

我找到了答案,希望它可以帮助别人......

在paintEvent()中创建QPainter实例时,需要为小部件视口提供QPainter。

要使其显示文本,请包含父类的super()方法。

def paintEvent(self, event):
    painter = QPainter(self.viewport())
    pen = QPen(Qt.SolidLine)
    pen.setColor(Qt.black)
    pen.setWidth(1)
    painter.setPen(pen)
    painter.drawLine(20, 0, 20, 100)
    super(TextWidgetWithLines, self).paintEvent(event)