pyqt6:在高度缩小后重新绘制qtextedit的底部边框?

kuarbcqp  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(422)

我有一个从qtextedit子类化的textboxs类,它会自动调整其内容的大小,并且在调整窗口大小时也会调整大小。
文本可能很长,文本框会自动换行,因此当水平空间增加时,文本框的高度会缩小,因为换行的行数会减少。
问题是当文本框缩小时,它们的下边框将丢失,除非窗口宽度缩小,否则它们将只有左、上和右边框。
最小、可重复的示例:

from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *

class Editor(QTextEdit):
    def __init__(self):
        super().__init__()
        self.textChanged.connect(self.autoResize)

    def autoResize(self):
        self.document().setTextWidth(self.viewport().width())
        margins = self.contentsMargins()
        height = int(self.document().size().height() + margins.top() + margins.bottom())
        self.setFixedHeight(height)

    def resizeEvent(self, e: QResizeEvent) -> None:
        self.autoResize()

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(405, 720)
        frame = self.frameGeometry()
        center = self.screen().availableGeometry().center()
        frame.moveCenter(center)
        self.move(frame.topLeft())
        self.vbox = QVBoxLayout(self)
        self.vbox.setAlignment(Qt.AlignmentFlag.AlignTop)
        self.textbox = Editor()
        self.textbox.setText(
            'Symphony No.6 in F, Op.68 \u2014Pastoral\u2014I. Erwachen heiterer Empfindungen bei der Ankunft auf dem Lande\u2014 Allegro ma non troppo'
        )
        self.vbox.addWidget(self.textbox)

app = QApplication([])
window = Window()
window.show()
app.exec()

单击“最大化”按钮时,文本框将从三行换行变为一行,在恢复窗口之前,底部边框将丢失。
我想重新绘制边界,我在谷歌搜索了8个多小时,却找不到解决方案,我尝试添加以下内容 autoResize 功能无效:

self.update()
self.viewport().update()
self.repaint()
self.viewport().repaint()
self.setFrameRect(QRect(0, 0, self.width(), height))

如何做到这一点?

carvr3hs

carvr3hs1#

我知道了,如果文本行数发生变化,边框将重新计算,所以只需定义一个 resizeEvent 在qtextedit的父级中,添加新行并删除新行,作业完成。
守则:

def resizeEvent(self, e: QResizeEvent) -> None:
    text = self.textbox.toPlainText()
    self.textbox.setText(text + '\n')
    self.textbox.setText(text)

再想一想,最好使用一个可以拦截 resizeEvent ,并创建信号,使其在每次调整窗口大小时发出信号,然后将信号连接到插槽。
我使用qmain窗口截获事件。
示例代码:

class  UI_MainWindow(QMainWindow):
    resized = pyqtSignal(QMainWindow)
    def __init__(self):
        super().__init__()
        ...
    def resizeEvent(self, e: QResizeEvent) -> None:
        self.resized.emit(self)

上面是主窗口。

Window = UI_MainWindow()
class TextCell(QVBoxLayout):
    ...
    Window.resized.connect(self.redraw_border)
    def redraw_border(self):
        text = self.editor.toPlainText()
        self.editor.setText(text + '\n')
        self.editor.setText(text)
``` `TextCell` 是文本框的容器,并且 `editor` 是自动调整大小的文本框。

相关问题