如何在 Qt 中保持小部件的纵横比以及如何使小部件居中?
最佳答案
我也试图达到要求的效果:一个保持固定纵横比的小部件,同时保持在其分配空间的中心。起初我尝试了这个问题的其他答案:
heightForWidth
和 hasHeightForWidth
正如 marc-mutz-mmutz 所建议的那样,根本不适合我。 我最终创建了一个响应
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/