Код: Выделить всё
import sys, random
from PyQt5 import QtWidgets, QtCore, QtGui
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
main_splitter = MainSplitter(self)
self.setCentralWidget(main_splitter)
main_splitter.setOrientation(QtCore.Qt.Vertical)
main_splitter.setStyleSheet('background-color: red; border: 1px solid pink;');
# top component of vertical splitter: a QFrame to hold horizontal splitter and breadcrumbs QPlainTextEdit
top_frame = QtWidgets.QFrame()
top_frame_layout = QtWidgets.QVBoxLayout()
top_frame.setLayout(top_frame_layout)
top_frame.setStyleSheet('background-color: green; border: 1px solid green;');
main_splitter.addWidget(top_frame)
# top component of top_frame: horizontal splitter
h_splitter = HorizontalSplitter()
h_splitter.setStyleSheet('background-color: cyan; border: 1px solid orange;')
top_frame_layout.addWidget(h_splitter)
# bottom component of top_frame: QPlainTextEdit (for "breadcrumbs")
self.breadcrumbs_pte = BreadcrumbsPTE(top_frame)
top_frame_layout.addWidget(self.breadcrumbs_pte)
self.text = 'some plain text '
self.breadcrumbs_pte.setPlainText(self.text * 50)
self.breadcrumbs_pte.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.breadcrumbs_pte.setStyleSheet('background-color: orange; border: 1px solid blue;');
self.breadcrumbs_pte.setMinimumWidth(300)
self.breadcrumbs_pte.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
# bottom component of vertical splitter: a QFrame
bottom_panel = BottomPanel(main_splitter)
bottom_panel.setStyleSheet('background-color: magenta; border: 1px solid cyan;')
main_splitter.addWidget(bottom_panel)
def resizeEvent(self, *args):
print('resize event...')
n_repeat = random.randint(10, 50)
self.breadcrumbs_pte.setPlainText(self.text * n_repeat)
super().resizeEvent(*args)
class BreadcrumbsPTE(QtWidgets.QPlainTextEdit):
def sizeHint(self):
return QtCore.QSize(500, 100)
class MainSplitter(QtWidgets.QSplitter):
def sizeHint(self):
return QtCore.QSize(40, 150)
class HorizontalSplitter(QtWidgets.QSplitter):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setOrientation(QtCore.Qt.Horizontal)
self.left_panel = LeftPanel()
self.left_panel.setStyleSheet('background-color: yellow; border: 1px solid black;');
self.addWidget(self.left_panel)
self.left_panel.setMinimumHeight(150)
right_panel = QtWidgets.QFrame()
right_panel.setStyleSheet('background-color: black; border: 1px solid blue;');
self.addWidget(right_panel)
# to achieve 66%-33% widths ratio
self.setStretchFactor(0, 20)
self.setStretchFactor(1, 10)
def sizeHint(self):
return self.left_panel.sizeHint()
class LeftPanel(QtWidgets.QFrame):
def sizeHint(self):
return QtCore.QSize(150, 250)
class BottomPanel(QtWidgets.QFrame):
def sizeHint(self):
return QtCore.QSize(30, 180)
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
Чего я пытаюсь достичь: я хочу, чтобы текст в QPlainTextEdit регулировал размер этого компонента и компонента над ним (
Код: Выделить всё
HorizontalSplitterЯ хочу, чтобы это произошло, чтобы не было необходимости корректировать размер появляется главное окно (очевидно, если бы это произошло, это, как написано в коде, в настоящее время привело бы к бесконечному срабатыванию MainWindow.resizeEvent()).
Учебные руководства на Qt/PyQt, похоже, просто не дает исчерпывающего технического объяснения того, как работают все различные механизмы и как они взаимодействуют. Например, я знаю, что sizeHint играет решающую роль в определении размеров и макетов, но, если не пытаться глубоко изучить исходный код, я не знаю, как я могу улучшить свое понимание.
Например, здесь я пробовал бесконечные варианты комментирования sizeHint для различных классов, включая их все: но self.top_pte.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) кажется, никогда не работает (то есть так, как я хочу!).
При необходимости можно использовать BottomPanel (т. е. второй дочерний элемент вертикального QSplitter). установите минимальную и максимальную высоту (т.е. фиксированную высоту), чтобы упростить задачу. Основная цель состоит в том, чтобы настроить горизонтальный QSplitter и QPlainTextEdit так, чтобы высота последнего идеально подстраивалась под текст, который он содержит...
Подробнее здесь: https://stackoverflow.com/questions/787 ... intextedit