将小部件添加到Vbox Layou时的大小调整问题

2024-05-14 16:46:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是PyQt5的新手,我正在处理QLayouts的问题。。。你知道吗

class welcomeWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initText()
        self.organize()

    def initText(self):
        self.welcome = QLabel("Welcome to Name!", self)
        self.info = QLabel("This program allows you to....", self)
        self.message = QLabel("First, you must enter some data...", self)
        self.proceed = QLabel("Click on 'Next >>' to proceed.", self)

    def organize(self):
        vbox = QVBoxLayout(self)
        scroll = QScrollArea(self)
        vbox.addWidget(scroll)
        wid = QWidget(self)
        vevobox = QVBoxLayout(wid)

        vv = QVBoxLayout()
        vv.addWidget(self.welcome)
        vv.addWidget(self.info)
        vevobox.addLayout(vv)
        self.show()

看起来像这样。。。 image

Idk做什么,每当我添加其他Qlabel时,它们都会消失。你知道吗


Tags: toselfinfoyouinitdeforganizewelcome
1条回答
网友
1楼 · 发布于 2024-05-14 16:46:41

在展示解决方案之前,您必须解释一些事情:

  • 在小部件中设置布局有3种方法:

    1. 创建没有父级的小部件,然后小部件指示它使用带有setLayout()的布局:

      lay = QVBoxLayout()
      foo_widget.setLayout(lay)
      
    2. 指向构建布局时要管理的小部件。你知道吗

      lay = QVBoxLayout(foo_widget)
      
    3. 前面的方法是等效的,但第三种方法是将其建立为已建立布局的子对象。

  • 小部件只能具有顶层布局,因此如果只保留最后一个布局:

    lay1 = QVBoxLayout(foo_widget)
    lay2 = QVBoxLayout(foo_widget)
    
    # The above is equivalent to:
    
    lay1 = QVBoxLayout()
    lay2 = QVBoxLayout(foo_widget)
    
  • 当一个小部件在构造器中被设置为父部件,或者它被建立为处理小部件位置的布局的一部分时,它是另一个小部件的子部件:

    1.

    child_1 = Foo_Widget(some_widget)
    

    2.

    lay = Foo_Layout(some_widget)
    child_2 = Foo_Widget()
    lay.addWidget(child_2)
    

因此,如果您考虑上述因素,您可以减少代码:

...
def initText(self):
    self.welcome = QLabel("Welcome to Name!")
    self.info = QLabel("This program allows you to....")
    self.message = QLabel("First, you must enter some data...", self)
    self.proceed = QLabel("Click on 'Next >>' to proceed.", self)

def organize(self):
    vbox = QVBoxLayout(self)
    scroll = QScrollArea()
    vbox.addWidget(scroll)

    wid = QWidget(self)
    vevobox = QVBoxLayout(wid)

    vv = QVBoxLayout()
    vv.addWidget(self.welcome)
    vv.addWidget(self.info)
    vevobox.addLayout(vv)

    self.show()

使用上述方法,可以组装以下树:

welcomeWidget
├── message
├── proceed
├── vbox (QVBoxLayout)
│   └── scroll
└── wid 
    └── vevobox (QVBoxLayout)
        └──vv (QVBoxLayout)
           ├── info
           └── welcome

正如您所看到的,例如,有两个标签显示在所有内容的后面,因为它们最初是在没有布局的情况下建立的,然后在放置QScrollArea的地方建立了布局,所以最后一个标签占用了所有可用的空间,最后,没有布局的wid小部件被放置在左上角的位置,在这个小部件中,剩下的2个标签被建立。你知道吗

其思想是具有以下结构:

welcomeWidget
└── vbox (QVBoxLayout)
    └── scroll
        └── wid
            └── vv (QVBoxLayout)
                ├── info
                ├── message
                ├── proceed
                └── welcome

使用上述方法可以得到以下结果:

class welcomeWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initText()
        self.organize()

    def initText(self):
        self.welcome = QLabel("Welcome to Name!")
        self.info = QLabel("This program allows you to....")
        self.message = QLabel("First, you must enter some data...")
        self.proceed = QLabel("Click on 'Next >>' to proceed.")

    def organize(self):
        vbox = QVBoxLayout(self)
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)

        wid = QWidget()
        scroll.setWidget(wid)

        vv = QVBoxLayout(wid)
        vv.addWidget(self.welcome)
        vv.addWidget(self.info)
        vv.addWidget(self.message)
        vv.addWidget(self.proceed)
        vv.addStretch()

        vbox.addWidget(scroll)
        self.show()

相关问题 更多 >

    热门问题