0

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()

最大化ボタンをクリックすると、テキスト ボックスが 3 行から 1 行になり、ウィンドウを元に戻すまで下の境界線が失われます。

境界線を再描画したいのですが、Google で 8 時間以上検索しましたが、解決策が見つかりませんでした。次のautoResize機能を追加しようとしましたが、役に立ちませんでした。

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

これはどのように行うことができますか?

4

1 に答える 1