#python #layout #pyqt5 #qvboxlayout
#python #планировка #pyqt5 #qvboxlayout
Вопрос:
Нигде не нашел этой точной проблемы, или, может быть, я просто не узнаю ее у других. Я все еще новичок в программировании, но не совсем забываю, я пытаюсь создать приложение с PyQt5, но у меня возникли проблемы с правильной настройкой макета, прежде чем делать более серьезное кодирование в будущем.
Как вы увидите, я пытаюсь создать свой основной макет, используя QHBoxLayout с двумя макетами QVBoxLayout внутри него. Я добавил несколько случайных виджетов в каждый вертикальный макет, которые отлично работают сами по себе, за исключением случаев, когда я пытаюсь придать им фиксированный размер. ListWidget и lineEdit в левом вертикальном макете не остаются там, где я хочу, чтобы они были или как я хочу, чтобы они были, при задании фиксированной ширины / высоты / размера, когда я вручную изменяю размер окна приложения, как показано на рисунках. Очевидно, я хочу, чтобы они оставались в верхнем левом углу, а любой последующий виджет — прямо под первым, вторым и т. Д. То же самое происходит с tabswidget всякий раз, когда я пытаюсь применить то же самое.
Я поиграл с геометрией, точками размеров, выравниваниями и т. Д., Но, похоже, я просто не могу в этом разобраться. Прилагаю ссылки на две фотографии проблемы:
И заключающий в себе важную часть кода:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
self.createactions()
self.createmenus()
self.createtoolbar()
self.container = FrameContainer()
self.setCentralWidget(self.container)
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(100,100,800,600)
self.statusBar().showMessage("Statusbar - awaiting user control")
self.show()
class FrameContainer(QWidget):
def __init__(self):
super(QWidget, self).__init__()
self.setContentsMargins(0,0,0,0)
self.mainlayout = QHBoxLayout(self)
self.mainlayout.setSpacing(0)
self.mainlayout.setContentsMargins(0, 0, 0, 0)
self.verticalwidgets()
self.mainlayout.addLayout(self.box_layout1)
self.mainlayout.addLayout(self.box_layout2)
def verticalwidgets(self):
# Left side
self.box_layout1 = QVBoxLayout()
self.box_layout1.setContentsMargins(0,0,0,0)
self.box_layout1.setSpacing(0)
self.list_widget = QListWidget()
self.list_widget.setFixedSize(200,500)
self.list_widget.sizeHintForColumn(0)
self.someWidget3 = QLineEdit()
self.someWidget3.setFixedWidth(200)
self.box_layout1.addWidget(self.list_widget, Qt.AlignLeft)
self.box_layout1.addWidget(self.someWidget3, Qt.AlignLeft)
# Right side
self.box_layout2 = QVBoxLayout()
self.box_layout2.setContentsMargins(0,0,0,0)
self.box_layout2.setGeometry(QRect(0, 0, 800, 680))
self.tabs_widget = TabsWidget(self)
self.box_layout2.addWidget(self.tabs_widget)
class TabsWidget(QWidget):
def __init__(self, child):
super(QWidget, self).__init__()
self.layout = QHBoxLayout(self)
self.layout.setContentsMargins(0,0,0,0)
self.tabs = QTabWidget()
self.tabs.setTabsClosable(True)
self.tab1 = QWidget()
self.tab2 = QWidget()
self.tab3 = QWidget()
# Add tabs
self.tabs.addTab(self.tab1, "Tab 1")
self.tabs.addTab(self.tab2, "Tab 2")
self.tabs.addTab(self.tab3, "Tab 3")
# Create first tab
self.tab1.layout = QVBoxLayout(self)
self.pushButton1 = QPushButton("Button 1")
self.pushButton2 = QPushButton("Button 2")
self.pushButton3 = QPushButton("Button 3")
self.tab1.layout.addWidget(self.pushButton1)
self.tab1.layout.addWidget(self.pushButton2)
self.tab1.layout.addWidget(self.pushButton3)
self.tab2.layout = QVBoxLayout(self)
self.tab2.layout.addWidget(QLabel("Peterpaned"))
self.tab2.layout.addWidget(QLineEdit())
self.tab1.setLayout(self.tab1.layout)
self.tab2.setLayout(self.tab2.layout)
# Add tabs to widget
self.layout.addWidget(self.tabs)
Что я делаю не так? Не нужно обязательно давать мне кодовый ответ, если только вам не захочется, я думаю, будет достаточно серьезного толчка в правильном направлении, или, по крайней мере, я надеюсь, что это так.
Ответ №1:
Вы можете добавить разделители в свой макет (горизонтальный или вертикальный, в зависимости от того, где вы их разместили) и установить для них политику нефиксированного размера. Таким образом, при изменении размера окна будут растягиваться (или укорачиваться) только разделители.
Комментарии:
1. Это сработало! Я предполагаю, что это будет работать и внутри виджета tabs, Если возникнет необходимость в правильном добавлении макетов и т. Д.?