不断使文本框变大
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)
我刚开始使用 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)