在resize事件中修改布局

问题描述 投票:0回答:2

浇水5. I.2,Pothon 3.6.6,Windows 10

我想根据容器小部件的当前宽度动态隐藏/显示小部件。如果space占据整个宽度按钮的不到10%,则“One”被隐藏,然后按钮“Two”。当用户使容器变大时,再次显示按钮:“Two”,然后是“One”。

enter image description here

这是我的实现的一个非常基本的版本,主要是有效的,但有一个大问题。我开始调整大小,按钮“One”隐藏,但随后一些约束到位,容器不能再缩小了。我必须释放鼠标按钮并再次启动过程以隐藏按钮“Two”。

enter image description here

import sys
from PyQt5 import QtWidgets

form, space, widgets = None, None, None

def resize_event(event):
    if free_space_width() < 0:
        visible_w = [w for w in widgets if w.isVisible()]
        if len(visible_w) > 1:  # do not hide the last one
            for w in visible_w:
                w.hide()
                if free_space_width(w.width()) >= 0:
                    break  # enough space
    else:
        invisible_w = [w for w in widgets if not w.isVisible()]
        for w in reversed(invisible_w):
            if free_space_width(-w.width()) < 0:
                break
            w.show()


def free_space_width(shift=0):
    "Free space should be at least 10% of the bar width"
    return space.width() + shift - 0.1 * form.width()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    form = QtWidgets.QWidget()
    layout = QtWidgets.QHBoxLayout(form)
    layout.setSpacing(0)  # for simplicity
    form.resize(480, 64)
    form.resizeEvent = resize_event

    widgets = [QtWidgets.QPushButton("test button %d" % (i + 1), form)
               for i in range(3)]
    for i in widgets:
        layout.addWidget(i)
    space = QtWidgets.QWidget(form)  # stretchable space
    s_policy = space.sizePolicy()
    s_policy.setHorizontalStretch(1)
    space.setSizePolicy(s_policy)
    layout.addWidget(space)

    form.show()
    sys.exit(app.exec_())
python pyqt pyqt5 qlayout
2个回答
0
投票

然后一些约束到位,容器的大小不能减小

layout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)

我认为你应该像这样在这个代码下实现它。

layout = QtWidgets.QHBoxLayout(form)
layout.setSpacing(0)  # for simplicity
layout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)

2
投票

可以将按钮放在容器小部件中并重新实现minimumSizeHint方法,因此Qt不会尝试自己计算。

def minimumSizeHint(self):
    return QtCore.QSize(150, 30)

更新:我在custom layoutsetGeometry函数中实现了show / hide逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.