Подтвердить что ты не робот

QVBoxLayout: как вертикально выравнивать виджеты вверху, а не центру

В Qt, когда я добавляю виджеты в свой макет, они по умолчанию по вертикали. Есть ли способ "Список" виджетов сверху вниз, а не центрировать их по вертикали?

4b9b3361

Ответ 1

используйте void QLayout::setAlignment ( Qt::Alignment alignment ) метод для установки выравнивания по вашему выбору.

Ответ 2

Я считаю это немного сложнее, чем просто использовать layout.setAlignment(). Он продолжал работать не для меня до тех пор, пока я не понял, что если у вас есть расширение виджета, на которое установлена ​​максимальная высота, то этот виджет не будет выровнен так, как вы хотите.

Вот пример кода, который не выравнивает виджет QTextBrowser(), даже если я вызываю layout.setAlignment(Qt.AlignTop). Извините, что он находится в Python, но его довольно легко перевести на С++ (я пошел другим путем много раз).

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
#         layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()

Следующее явно вызывает layout.setAlignment(info, Qt.AlignTop), чтобы заставить виджет расходуемого текста работать.

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
        layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()

Ответ 3

После сравнения между двумя решениями, кажется, что:

myLayout.setAlignment(Qt.AlignTop)

работает для нескольких выравниваний виджета, но:

myLayout.setAlignment(myWidget, Qt.AlignTop)

работает только для первого виджета, который вы добавляете в макет. В конце концов, решение зависит также от QSizePolicy ваших виджетов.

Ответ 4

Если у вас есть QVBoxLayout и хотите, чтобы виджеты фиксированного размера были уложены вверху, вы можете просто добавить вертикальное растяжение, добавив конец:

layout.addStretch()

Если у вас есть несколько носилок или другие элементы растяжения, вы можете указать аргумент коэффициента растяжения целого числа, который определяет их соотношение размеров.

См. также addStretch и addSpacerItem.

Не уверен, отвечает ли этот вопрос на ваш первоначальный вопрос, но это ответ на тот, который был у меня при поиске в Google и его ведении на эту страницу - так что это может быть полезно и для других.