user-interface - 如何在 Qt 中保持小部件的纵横比?

标签 user-interface qt widget aspect-ratio

如何在 Qt 中保持小部件的纵横比以及如何使小部件居中?

最佳答案

我也试图达到要求的效果:一个保持固定纵横比的小部件,同时保持在其分配空间的中心。起初我尝试了这个问题的其他答案:

  • 实现heightForWidthhasHeightForWidth正如 marc-mutz-mmutz 所建议的那样,根本不适合我。
  • 我简要地查看了实现自定义布局管理器,但是 Bleadof 的所有链接都已失效,当我发现 the documentation通读一遍,对于我想要实现的目标来说,它看起来太复杂了。

  • 我最终创建了一个响应 resizeEvent 的自定义小部件并使用 setContentsMargin 设置边距,使剩余内容区域保持所需的比例。

    我发现我还必须将小部件的大小策略设置为 QSizePolicy::Ignored在两个方向上避免因子小部件的大小请求而导致的奇怪的调整大小问题——最终结果是我的小部件接受其父级分配给它的任何大小(然后如上所述设置其边距以在其内容中保持所需的纵横比区域)。

    我的代码如下所示:

    from PySide2.QtWidgets import QWidget, QSizePolicy
    
    
    class AspectWidget(QWidget):
        '''
        A widget that maintains its aspect ratio.
        '''
        def __init__(self, *args, ratio=4/3, **kwargs):
            super().__init__(*args, **kwargs)
            self.ratio = ratio
            self.adjusted_to_size = (-1, -1)
            self.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))
    
        def resizeEvent(self, event):
            size = event.size()
            if size == self.adjusted_to_size:
                # Avoid infinite recursion. I suspect Qt does this for you,
                # but it's best to be safe.
                return
            self.adjusted_to_size = size
    
            full_width = size.width()
            full_height = size.height()
            width = min(full_width, full_height * self.ratio)
            height = min(full_height, full_width / self.ratio)
    
            h_margin = round((full_width - width) / 2)
            v_margin = round((full_height - height) / 2)
    
            self.setContentsMargins(h_margin, v_margin, h_margin, v_margin)
    

    (显然,这段代码是用 Python 编写的,但用 C++ 或您选择的语言表达应该很简单。)

    关于user-interface - 如何在 Qt 中保持小部件的纵横比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452333/

    相关文章:

    java - gridbaglayout垂直间隙

    c# - 如何为 skype 添加类似于 skype 生产力工具的窗口扩展?

    c++ - 如何获取 QDialogBu​​ttonBox 创建的按钮的名称?

    c++ - Qt:使 QHBoxLayout 可滚动

    python - 信号和槽连接中的星号是什么?

    python - Django 小部件模板覆盖不会在项目模板目录中搜索。怎么修?

    php - 在 wordpress 中更改小部件内的默认 HTML 标记

    jquery - 用户界面建议/导航想法(提供模型图像)

    java - 将菜单栏添加到网格 Pane

    c++ - 通过 QDirectPainter 绘画