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
相关产品推荐
相关产品推荐

