如何在 PyQt5 中为任何小部件设置固定大小而不会在调整大小时破坏布局

How to set a fixed size in PyQt5 for any widget without breaking layout when resizing

在任何地方都没有发现这个确切的问题,或者我只是没有从其他人那里发现它。作为编程的初学者但并非完全没有注意到,我正在尝试使用 PyQt5 创建一个应用程序,但在将来进行任何更严肃的编码之前我无法正确设置布局。

如您所见,我正在尝试通过使用其中包含两个 QVBoxLayout 布局的 QHBoxLayout 来完成我的主要布局。我在每个垂直布局中添加了一些随机的小部件,它们可以完美地独立工作,除非我试图给它们一个固定的尺寸。左侧垂直布局中的 ListWidget 和 LineEdit 不会停留在我想要的位置或我想要的位置,当给定一个固定的 width/height/size 时,一旦我手动调整应用程序窗口的大小,如图所示。显然,我希望它们留在左上角,任何后续小部件都位于第一个、第二个等下方。每当我尝试应用相同的选项卡小部件时,都会发生同样的情况。

我研究过几何、尺寸提示、对齐等,但我似乎无法弄明白。 附上两张问题图片的链接:

并附上代码的重要部分:

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)

我做错了什么?不一定要给我代码答案,除非你愿意,否则我认为会朝着正确的方向认真推动,或者至少我希望会。

您可以在布局中添加间隔符(水平或垂直,具体取决于放置它们的位置)并为其设置非固定大小策略。这样,每当 window 调整大小时,只有间隔符会拉伸(或缩短)。