为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2022-01-05 13:03:49
PyQt 5.9.2、Python 3.6.6、Windows 10我想根据其容器小部件的当前宽度动态隐藏/显示小部件。如果space小于整个宽度的 10% 按钮“一”被隐藏,则按钮“二”。当用户使容器变大时,按钮会再次显示:“两个”,然后是“一个”。这是我的实现的一个非常基本的版本,它大部分都有效,但有一个大问题。我开始调整大小,按钮“一”隐藏,但随后出现了一些限制,容器无法再缩小。我必须释放鼠标按钮并再次启动该过程以隐藏按钮“二”。import sysfrom PyQt5 import QtWidgetsform, space, widgets = None, None, Nonedef 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_())
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

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

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

更新:我已经在自定义布局setGeometry函数中实现了显示/隐藏逻辑。


查看完整回答
反对 回复 2022-01-05
?
largeQ

TA贡献2039条经验 获得超8个赞

那么一些约束就出现了,容器的大小不能减小


layout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)


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


layout = QtWidgets.QHBoxLayout(form)

layout.setSpacing(0)  # for simplicity

layout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号