Проблемы с компоновкой виджетов в PyQt5
Есть QTreeView, который должен прижиматься к левому краю и занимать фиксированный размер.
И создаваемые QTextBrowser, которые располагаются справа от него, занимая всё остальное место.
Однако после их удаления, при создании новых между ними и древом остаётся пустое место, то есть они не занимают положенное им место.
Я всё ещё немного плыву в системе компоновки Qt, так что не могу понять откуда берётся эта пустота.
Важный момент: текст в этих браузерах может изменяться и сохраняться в файлы, и чтобы это корректно работало он должен быть именно textbrowser а не selfl.textbrowser.
Минимально воспроизводимый пример:
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QTreeView, QTextBrowser, QPushButton
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.resize(600, 600)
self.treebox = QHBoxLayout()
self.box = QVBoxLayout()
self.treeView = QTreeView()
self.treeView.setFixedWidth(200)
self.treebox.setAlignment(Qt.AlignLeft)
treeModel = QStandardItemModel()
rootNode = treeModel.invisibleRootItem()
testrow = QStandardItem('123')
rootNode.appendRow(testrow)
self.treeView.doubleClicked.connect(self.text_manager)
self.treeView.setModel(treeModel)
self.treeView.expandAll()
self.box.addWidget(self.treeView)
self.treebox.addLayout(self.box)
self.setLayout(self.treebox)
def text_manager(self, val):
self.treeView.setCurrentIndex(val)
textbrowser = QTextBrowser()
closebtn = QPushButton('x')
tblayout = QVBoxLayout()
tblayout.addWidget(closebtn)
tblayout.addWidget(textbrowser)
self.treebox.addLayout(tblayout)
def close_tb():
self.box.setAlignment(Qt.AlignLeft)
self.treebox.setAlignment(Qt.AlignLeft)
closebtn.deleteLater()
textbrowser.deleteLater()
closebtn.clicked.connect(close_tb)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWin()
w.show()
sys.exit(app.exec_())
Скриншот проблемы(пустое место между виджетами):

Ответы (1 шт):
я немного упорядочил ваш код, чтобы он работал так как вы хотите.
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, \
QTreeView, QTextBrowser, QPushButton
class MyWin(QWidget):
def __init__(self):
super().__init__()
treeModel = QStandardItemModel()
rootNode = treeModel.invisibleRootItem()
testrow = QStandardItem('123')
rootNode.appendRow(testrow)
self.treeView = QTreeView()
self.treeView.setFixedWidth(200)
self.treeView.doubleClicked.connect(self.text_manager)
self.treeView.setModel(treeModel)
self.treeView.expandAll()
self.treebox = QHBoxLayout(self)
self.treebox.setAlignment(Qt.AlignLeft)
self.treebox.addWidget(self.treeView, 0)
def text_manager(self, val):
self.treeView.setCurrentIndex(val)
widget = QWidget() # +++
textbrowser = QTextBrowser()
closebtn = QPushButton('x')
closebtn.clicked.connect(lambda ch, w=widget : self.close_tb(w)) # +++
tblayout = QVBoxLayout(widget)
tblayout.setContentsMargins(0, 0, 0, 0)
tblayout.addWidget(closebtn)
tblayout.addWidget(textbrowser)
self.treebox.addWidget(widget, 1)
def close_tb(self, w): # +++
w.deleteLater()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWin()
w.resize(600, 600)
w.show()
sys.exit(app.exec_())
