PyQt5 эквивалент WPF StackPanel - PullRequest
       15

PyQt5 эквивалент WPF StackPanel

0 голосов
/ 13 января 2019

Я работаю с PyQt5 и хотел бы поместить некоторые элементы управления друг на друга. Я хочу, чтобы эти элементы управления могли определять свой собственный размер на основе их содержимого. Например, если у меня было три кнопки с содержимым «один», «два два» и «три три три», первая кнопка должна быть наименьшей, а в левом верхнем углу вторая должна быть сразу под первой и чуть шире и тд. Следует отметить, что они будут помещены в QScrollArea, вы можете ожидать сотни сложенных предметов.

Я пробовал QVBoxLayout, но все кнопки имеют одинаковый размер, растягиваются по экрану и плавают в середине, если недостаточно для заполнения родительского элемента.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете установить выравнивание виджетов в QVboxLayout, чтобы они не растягивались по ширине. И вы также можете добавить растягиваемую проставку в конец макета, чтобы виджеты не располагались вертикально.

При помещении внутрь области прокрутки она будет выглядеть следующим образом:

screenshot

Вот простая демонстрация:

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        scroll = QtWidgets.QScrollArea()
        widget = QtWidgets.QWidget(scroll)
        vbox = QtWidgets.QVBoxLayout(widget)
        for index in range(5):
            for text in 'One', 'Two Two', 'Three Three Three':
                button = QtWidgets.QToolButton()
                button.setText('%s %s' % (text, index))
                vbox.addWidget(button, 0, QtCore.Qt.AlignLeft)
        vbox.addStretch()
        scroll.setWidget(widget)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(scroll)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 300)
    window.show()
    sys.exit(app.exec_())
0 голосов
/ 13 января 2019

Попробуйте:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class MyWin(QtWidgets.QWidget):
    def __init__(self, nameButton, parent=None):                        
        super().__init__()

        self.lay = QtWidgets.QGridLayout(self)
        self.lay.setContentsMargins(10, 10, 10, 10)

        for ind, itm in enumerate(nameButton):
            text = "{} {}".format(itm, itm*ind)
            self.button = QtWidgets.QPushButton(text)
            self.button.setFixedWidth(
                QtGui.QFontMetrics(self.button.font()).width(self.button.text()+"___"))
            self.button.clicked.connect(self.onButton)
            self.lay.addWidget(self.button, ind, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)

        self.lay.setRowStretch(ind+1, 1)

    def onButton(self):
        print(self.sender().text())


nameButton = [' one', ' two ', ' three ']

if __name__=="__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin(nameButton)                                         
    myapp.show()
    sys.exit(app.exec_())

enter image description here

...