Проблемы с размером при добавлении виджета в Vbox Layout - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в 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

Иду, что делать, и когда я добавляю другие QLabels, они просто исчезают.

1 Ответ

0 голосов
/ 18 сентября 2018

Перед тем, как показать решение, вы должны объяснить несколько вещей:

  • Существует 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()

UsВ соответствии с вышесказанным можно собрать следующее дерево:

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

И, как вы видите, это то, что ожидается, например, есть 2 метки, которые отображаются за всем, так как они были впервые созданы без макета, затембыл создан макет, в котором был размещен QScrollArea, поэтому этот последний занял все доступное пространство, и, наконец, виджет виджета без макета был размещен так, что он будет в верхнем левом положении, а внутри этого виджета оставшиеся 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...