不断使文本框变大

Constantly make the textbox larger

我刚开始使用 Python PyQt5,我正在尝试制作一个 GUI。一切正常,但我的文本框有问题。每次文本框被填满并且我尝试添加更多时,它保持相同的大小并且只是在文本框中添加一个小滚动条。我想要的是根据文本的大小重新调整文本框,以便您始终可以看到文本。我该怎么做。

这是我当前的代码:

#Import Module
from PyQt5.QtGui import QFont
from PyQt5 import QtWidgets
from PyQt5 import QtCore 
from PyQt5 import QtGui
import sys

#Create Main Class
class AddToDeckWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(AddToDeckWindow, self).__init__()

        #Set The UI
        self.initUI()

        #Set The GUI Position And Size
        self.setGeometry(200, 200, 900, 710)

        #Set The GUI Title
        self.setWindowTitle("Add")

        #Set The GUI Icon
        self.setWindowIcon(QtGui.QIcon('give_way.png'))

        #Set The Translator
        _translate = QtCore.QCoreApplication.translate
        
    def initUI(self):
        widAddToDeckWindow = QtWidgets.QWidget(self)

        #Create The Text Box
        self.setCentralWidget(widAddToDeckWindow)
        textBox = QtWidgets.QTextEdit(widAddToDeckWindow)
        textBox.setGeometry(200, 200, 500, 200)

        #Set The Font
        font = QFont()
        font.setPointSize(14)
        textBox.setFont(font)

#Create A Windows
def window():
    app = QtWidgets.QApplication(sys.argv)
    win = AddToDeckWindow()

    #Centers The Window On The Screen
    qtRectangle = win.frameGeometry()
    centerPoint = QtWidgets.QDesktopWidget().availableGeometry().center()
    qtRectangle.moveCenter(centerPoint)
    win.move(qtRectangle.topLeft())

    win.show()
    sys.exit(app.exec_())

window()

首先,考虑到您不是使用layout manager,并且像您一样使用固定几何形状,这被认为是不好的做法,也是非常想法。

例如,在您的情况下,如果我尝试将 window 的大小调整为小于文本编辑的右下角,它将部分(或完全)不可见。

强烈建议您不要使用这种模式(实际上,几乎每个人都会这样做),因为如果您想显示如此大的边距,您只需要正确使用布局属性即可。

就是说,如果您想根据内容调整文本编辑器的大小,则必须实现一个不断检查其 document().

的函数

然后,您应该选择是否设置 minimumHeight, or, better the sizeHint,如果没有更多 space 可用,布局将使用它来限制其大小。我强烈建议你使用后者。

class ResizingTextEdit(QtWidgets.QTextEdit):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.textChanged.connect(self.computeHint)
        self._sizeHint = super().sizeHint()

    def computeHint(self):
        hint = super().sizeHint()
        height = self.document().size().height()
        height += self.frameWidth() * 2
        self._sizeHint.setHeight(max(height, hint.height()))
        self.updateGeometry()
        self.adjustSize()

    def sizeHint(self):
        return self._sizeHint


class AddToDeckWindow(QtWidgets.QMainWindow):
    # ...
    def initUI(self):
        widAddToDeckWindow = QtWidgets.QWidget(self)

        #Create The Text Box
        self.setCentralWidget(widAddToDeckWindow)
        textBox = ResizingTextEdit(widAddToDeckWindow)
        textBox.setMinimumSize(500, 200)

        # this is no more necessary, as the layout will completely override it
        # textBox.setGeometry(200, 200, 500, 200)
        
        layout = QtWidgets.QGridLayout(widAddToDeckWindow)

        layout.addWidget(textBox, 1, 1)
        layout.setColumnStretch(0, 1)
        layout.setColumnStretch(2, 1)
        layout.setRowStretch(0, 1)
        layout.setRowStretch(2, 1)

        #Set The Font
        font = QFont()
        font.setPointSize(14)
        textBox.setFont(font)

如果是 minimumHeight,请使用以下内容:

class ResizingTextEdit(QtWidgets.QTextEdit):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.textChanged.connect(self.computeHint)

    def computeHint(self):
        height = self.document().size().height()
        height += self.frameWidth() * 2
        if height > super().sizeHint().height():
            self.setMinimumHeight(height)
        else:
            self.setMinimumHeight(0)