首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整QWindow大小以适应内容

调整QWindow大小以适应内容
EN

Stack Overflow用户
提问于 2019-09-10 17:00:00
回答 1查看 249关注 0票数 1

我的PyQt5应用程序的主窗口是在一个显示图像的定制画布小部件的顶部设置一个文本标签的:

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets


class Canvas(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.image = None

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        if self.image:
            qp.drawImage(0, 0, self.image)


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.canvas = Canvas()

        self.label = QtWidgets.QLabel()
        self.label.setText('foobar')
        self.label.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                QtWidgets.QSizePolicy.Fixed)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.canvas)
        layout.setSpacing(0)
        layout.setContentsMargins(0, 0, 0, 0)

        content = QtWidgets.QWidget()
        content.setLayout(layout)
        self.setCentralWidget(content)

        self.load_image('a.jpg')

    def load_image(self, filename):
        image = QtGui.QImage(filename)
        self.canvas.image = image
        self.canvas.setFixedSize(image.width(), image.height())
        self.update()

    def keyPressEvent(self, event):
        self.load_image('b.jpg')


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

这个看起来像这样,这就是我想要的

当画布更改为显示较小的图像时,我希望收缩窗口以相应地适应。然而,看起来是这样的:

如果手动拖动来调整窗口的大小,那么它的最小大小似乎是适合内容的大小,但是为什么它不自动调整大小呢?

EN

回答 1

Stack Overflow用户

发布于 2019-09-10 17:32:55

当设置固定大小时,它被用作sizeHint,而后者被布局用来设置小部件大小。因此,画布的大小取决于小部件的大小,但您希望相反。必须将图像大小缩放到窗口大小:

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets


class Canvas(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding
        )
        self.image = QtGui.QImage()

    @property
    def image(self):
        return self._image

    @image.setter
    def image(self, image):
        self._image = image
        self.update()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        if not self.image.isNull():
            image = self.image.scaled(
                self.size(), QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation
            )
            qp.drawImage(0, 0, image)


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.canvas = Canvas()

        self.label = QtWidgets.QLabel("foobar")
        self.label.setSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed
        )

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.canvas)
        layout.setSpacing(0)
        layout.setContentsMargins(0, 0, 0, 0)

        content = QtWidgets.QWidget()
        content.setLayout(layout)
        self.setCentralWidget(content)

        self.load_image("a.jpg")

    def load_image(self, filename):
        image = QtGui.QImage(filename)
        self.canvas.image = image

    def keyPressEvent(self, event):
        self.load_image('b.jpg')
        super().keyPressEvent(event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57875347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档