1

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

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

在我的 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)and添加painter.end()到 paintEvent() 方法中,但也对此不满意。

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

我在这里做了什么非常愚蠢的事情,还是有更好/更简单的方法来解决这个问题?

谢谢。

4

1 回答 1

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)
于 2015-05-21T14:07:22.063 回答