不断地使文本框变大

2024-06-28 11:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始使用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()

Tags: thefromimportselfdefcreatesysgui
1条回答
网友
1楼 · 发布于 2024-06-28 11:30:59

首先,请考虑使用{{a1},使用固定几何图形(如你所做的)而不是,这被认为是不好的练习,也是一个非常强的<坏> /强>想法。

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

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

也就是说,如果要根据文本编辑的内容调整其大小,必须实现一个不断检查其^{}的函数

然后,您应该选择是否设置^{},或者更好的是设置^{},如果没有更多可用空间,布局将使用它来限制其大小。我强烈建议你使用后者

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)

相关问题 更多 >