Как я могу реализовать адаптивный QPlainTextEdit?Python

Программы на Python
Anonymous
Как я могу реализовать адаптивный QPlainTextEdit?

Сообщение Anonymous »

Вот MRE:

Код: Выделить всё

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 изменится каждый раз.
Чего я пытаюсь достичь: я хочу, чтобы текст в QPlainTextEdit регулировал размер этого компонента и компонента над ним (

Код: Выделить всё

HorizontalSplitter
), чтобы QPlainTextEdit просто идеально содержал текст, не оставляя места внизу.
Я хочу, чтобы это произошло, чтобы не было необходимости корректировать размер появляется главное окно (очевидно, если бы это произошло, это, как написано в коде, в настоящее время привело бы к бесконечному срабатыванию MainWindow.resizeEvent()).
Учебные руководства на Qt/PyQt, похоже, просто не дает исчерпывающего технического объяснения того, как работают все различные механизмы и как они взаимодействуют. Например, я знаю, что sizeHint играет решающую роль в определении размеров и макетов, но, если не пытаться глубоко изучить исходный код, я не знаю, как я могу улучшить свое понимание.
Например, здесь я пробовал бесконечные варианты комментирования sizeHint для различных классов, включая их все: но self.top_pte.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) кажется, никогда не работает (то есть так, как я хочу!).
При необходимости можно использовать BottomPanel (т. е. второй дочерний элемент вертикального QSplitter). установите минимальную и максимальную высоту (т.е. фиксированную высоту), чтобы упростить задачу. Основная цель состоит в том, чтобы настроить горизонтальный QSplitter и QPlainTextEdit так, чтобы высота последнего идеально подстраивалась под текст, который он содержит...

Подробнее здесь: https://stackoverflow.com/questions/787 ... intextedit

Вернуться в «Python»