You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt:布局拉伸空间内保持宽高比的控件对齐问题

QSvgWidget在布局中保持宽高比时的对齐异常问题

初看之下,保持QSvgWidget的宽高比似乎非常简单,于是写出了这样的代码:

class ScaledSvgWidget(QSvgWidget):

    def __init__(self, parent=None, keep_aspect_ratio=True):
        super().__init__(parent)
        self.keep_aspect_ratio = keep_aspect_ratio

    def resizeEvent(self, e):
        if self.keep_aspect_ratio:
            self.resize(self.sizeHint().scaled(e.size(), Qt.AspectRatioMode.KeepAspectRatio))

这段代码单独运行时可以正常工作,但将其放入包含其他元素的QHBoxLayout中时,就会出现异常情况:

self.svg_widget_left = ScaledSvgWidget(left_file)
    self.svg_widget_right = ScaledSvgWidget(right_file)
    self.svg_widget_left.setStyleSheet("border: 1px solid red")
    self.svg_widget_right.setStyleSheet("border: 1px solid red")

    svg_layout = QHBoxLayout()
    self.bg_vlayout.addLayout(svg_layout, 5)
    svg_layout.addStretch(1)
    svg_layout.addWidget(self.svg_widget_left)

    svg_layout.addWidget(self.svg_widget_right)
    svg_layout.addStretch(1)

错误对齐效果

两个方形控件本应位于文本控件下方,但实际并未正确对齐,请问问题出在哪里?


更新:最小复现示例

以下是可直接运行的最小复现代码(main.py):

import sys
from PySide6.QtCore import QByteArray
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from PySide6.QtSvgWidgets import *

picture = """<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="250" cy="250" r="250" stroke="black"
  stroke-width="2" fill="green" />
</svg>"""

class ScaledSvgWidget(QSvgWidget):
    def __init__(self, parent=None, keep_aspect_ratio=True):
        super().__init__(parent)
        self.keep_aspect_ratio = keep_aspect_ratio

    def resizeEvent(self, e):
        if self.keep_aspect_ratio:
            self.resize(self.sizeHint().scaled(e.size(), Qt.AspectRatioMode.KeepAspectRatio))

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.bg = QFrame(self)
        self.bg_hlayout = QHBoxLayout()
        self.bg.setLayout(self.bg_hlayout)

        left_svg = QByteArray(bytes(picture, encoding="UTF-8"))
        right_svg = QByteArray(bytes(picture, encoding="UTF-8"))

        self.svg_widget_left = ScaledSvgWidget()
        self.svg_widget_left.load(left_svg)
        self.svg_widget_right = ScaledSvgWidget()
        self.svg_widget_right.load(right_svg)
        self.svg_widget_left.setStyleSheet("border: 1px solid red")
        self.svg_widget_right.setStyleSheet("border: 1px solid red")

        self.bg_hlayout.addStretch(1)
        self.bg_hlayout.addWidget(self.svg_widget_left)
        self.bg_hlayout.addWidget(self.svg_widget_right)
        self.bg_hlayout.addStretch(1)

        self.setCentralWidget(self.bg)
        self.show()

def main():
    app = QApplication()
    window = MainWindow()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

运行该代码后,将窗口调整为横向,即可复现控件对齐异常的问题。


更新2

已修复上述示例代码,现在可正常运行。


内容的提问来源于stack exchange,提问作者Kroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:48