如何解决PyQt6:在高度缩小后重新绘制 QTextEdit 的底部边框?
我有一类从 QTextEdit 子类化的文本框,它会自动调整其内容的大小,并且在调整窗口大小时也会调整大小。
文本可能很长,并且文本框会自动对文本进行换行,因此当水平空间增加时,由于换行较少,文本框的高度会缩小。
问题是当文本框缩小时,它们的下边框将丢失,除非窗口的宽度缩小,否则它们将只有左、上和右边框。
最小的、可重现的例子:
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,self.width(),height))
如何做到这一点?
解决方法
我知道了,如果文本行数发生变化,边框将重新计算,因此只需在 QTextEdit 的父项中定义一个 resizeEvent
,添加新行并删除新行,工作完成。
代码:
def resizeEvent(self,e: QResizeEvent) -> None:
text = self.textbox.toPlainText()
self.textbox.setText(text + '\n')
self.textbox.setText(text)
再想一想,最好使用可以拦截 resizeEvent
的小部件,并创建一个信号并使其在每次调整窗口大小时发出信号,并将信号连接到插槽。
我使用 QMainWindow 拦截事件。
示例代码:
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
是自动调整大小的文本框。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。