在调整大小事件中修改布局

PyQt 5.9.2、Python 3.6.6、Windows 10

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

http://img4.mukewang.com/61d5274000017aba05060056.jpg

这是我的实现的一个非常基本的版本,它大部分都有效,但有一个大问题。我开始调整大小,按钮“一”隐藏,但随后出现了一些限制,容器无法再缩小。我必须释放鼠标按钮并再次启动该过程以隐藏按钮“二”。

http://img.mukewang.com/61d5274f0001e6d300040003.jpg

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_())


肥皂起泡泡
浏览 158回答 2
2回答

慕村9548890

可以将按钮放在容器小部件中并重新实现minimumSizeHint方法,因此 Qt 不会尝试自行计算。def&nbsp;minimumSizeHint(self): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;QtCore.QSize(150,&nbsp;30)更新:我已经在自定义布局的setGeometry函数中实现了显示/隐藏逻辑。

largeQ

那么一些约束就出现了,容器的大小不能减小layout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)我认为你应该像这样在这段代码下实现它。layout = QtWidgets.QHBoxLayout(form)layout.setSpacing(0)&nbsp; # for simplicitylayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python