Mar*_*utz 17
您不必实现自己的布局管理器.你可以做继承QWidget和重新实现
int QWidget::heightForWidth( int w ) { return w; }
Run Code Online (Sandbox Code Playgroud)
保持广场 但是,heightForWidth()对于X11上的顶级窗口不起作用,因为显然X11协议不支持它.至于居中,你可以传递Qt::AlignCenter第三个参数QBoxLayout::addWidget()或第五个参数QGridLayout::addWidget().
注意:至少在Qt的较新版本中,QWidget不具有heightForWidth或widthForHeight不再(因此它们不能被覆盖),因此setWidthForHeight(true)或setHeightForWidth(true) 仅对QGraphicsLayout的后代有效.
正确的答案是创建自定义布局管理器.这可以通过继承QLayout来实现.
resize()从内部调用resizeEvent()从来没有对我有用 - 最好它会导致闪烁,因为窗口调整大小两次(就像你有),最坏的情况是无限循环.
我认为维持固定宽高比的"正确"方法是创建自定义布局.你必须只重写两个方法,QLayoutItem::hasHeightForWidth()并且QLayoutItem::heightForWidth().
我也试图实现所要求的效果:一个保持固定纵横比同时保持在其分配空间中心的小部件。起初我尝试了这个问题的其他答案:
\n\nheightForWidth并hasHeightForWidth按照 marc-mutz-mmutz 的建议对我来说根本不起作用。我最终创建了一个自定义小部件,它响应resizeEvent并用于setContentsMargin设置边距,以便剩余内容区域保持所需的比例。
我发现我还必须将小部件的大小策略设置为QSizePolicy::Ignored双向,以避免因子小部件\xe2\x80\x94的大小请求而导致的奇怪的调整大小问题最终结果是我的小部件接受其父级分配给的任何大小(然后如上所述设置其边距,以在其内容区域中保持所需的宽高比)。
我的代码如下所示:
\n\nfrom PySide2.QtWidgets import QWidget, QSizePolicy\n\n\nclass AspectWidget(QWidget):\n \'\'\'\n A widget that maintains its aspect ratio.\n \'\'\'\n def __init__(self, *args, ratio=4/3, **kwargs):\n super().__init__(*args, **kwargs)\n self.ratio = ratio\n self.adjusted_to_size = (-1, -1)\n self.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))\n\n def resizeEvent(self, event):\n size = event.size()\n if size == self.adjusted_to_size:\n # Avoid infinite recursion. I suspect Qt does this for you,\n # but it\'s best to be safe.\n return\n self.adjusted_to_size = size\n\n full_width = size.width()\n full_height = size.height()\n width = min(full_width, full_height * self.ratio)\n height = min(full_height, full_width / self.ratio)\n\n h_margin = round((full_width - width) / 2)\n v_margin = round((full_height - height) / 2)\n\n self.setContentsMargins(h_margin, v_margin, h_margin, v_margin)\nRun Code Online (Sandbox Code Playgroud)\n\n(显然,此代码是用 Python 编写的,但用 C++ 或您选择的语言表达应该很简单。)
\n| 归档时间: |
|
| 查看次数: |
32475 次 |
| 最近记录: |