Как установить фиксированный размер в PyQt5 для любого виджета без нарушения макета при изменении размера

#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, Если возникнет необходимость в правильном добавлении макетов и т. Д.?