python - 在 PyQt 中的 QTextEdit 上绘制垂直线

标签 python pyqt qtextedit paintevent

我正在尝试开发一个包含 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)painter.end()添加到paintEvent()方法中,但也没有感到高兴。

此外,自从我添加了自定义 PaintEvent() 方法以来,最初在小部件中显示的文本不再显示。

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

谢谢。

最佳答案

我找到了答案,希望对其他人有帮助......

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

要让它显示文本,请包含父类的 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)

关于python - 在 PyQt 中的 QTextEdit 上绘制垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30371613/

相关文章:

python - 在模板中显示相关对象的数据 - Django

python - 如何将秒转换为 HH :MM:SS format without failing if hour more than 24

python - QTextBlock 或 QTextFrame 迭代器如何在 PyQt 中工作

python - 子类 QWebView 对超链接点击没有反应

python - 如何在我的文本编辑器中使用 PyQt 的字体小部件?

python - 获取QTextEdit选择的边界框

python - 人类可读的时间表语法,如我的应用程序中的功能?

python - Python中的小数时间

python - 如何在运行时更改工具栏中 Action 的图标?

pyqt - 如何在 PyQt5 中更改样式