【问题标题】:PyQt5 - resize label to fill the whole windowPyQt5 - 调整标签大小以填充整个窗口
【发布时间】:2017-09-20 00:26:00
【问题描述】:
from PyQt5 import QtGui, QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.label = QtWidgets.QLabel(self)
        self.label.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
        self.label.resize(800, 600)
        self.label.setContentsMargins(0, 0, 0, 0);
        self.pixmap = QtGui.QPixmap("image.jpg")
        self.label.setPixmap(self.pixmap)
        self.label.setMinimumSize(1, 1)
        self.label.installEventFilter(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.label)

    def eventFilter(self, source, event):
        if (source is self.label and event.type() == QtCore.QEvent.Resize):
            self.label.setPixmap(self.pixmap.scaled(
                self.label.size(), QtCore.Qt.KeepAspectRatio))
        return super(Window, self).eventFilter(source, event)

if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    window.resize(800, 600)
    sys.exit(app.exec_())

这是我的应用程序,我的目标很简单 - 拥有一个填充整个窗口并在窗口调整大小后调整大小的图像。

此代码在调整图像大小时可以正常工作,但标签并未覆盖整个窗口,我有那些“边框”。如何删除它们/将标签调整为窗口大小? 如果这改变了事情,我正在 Windows 上工作。

这就是我现在得到的效果。

【问题讨论】:

  • 应用程序的期望行为是什么?当图片image.jpg 适合窗口时(如在给定的屏幕截图中),会发生什么?图片的宽高比应该改变吗?还是应该裁剪部分图片?
  • @Matho 图片应该覆盖整个窗口,如果它太小应该放大。现在,如果我调整图片比例,但我不想要那些灰色的“边框”。
  • 图像(和窗口小部件)的纵横比应该保留还是必须遵循窗口的纵横比?
  • 我认为它应该或多或少地保留下来,但我也会采取第二种选择:)

标签: python qt pyqt window label


【解决方案1】:

我在 PyQt4 中解决了这个问题,所以我不能 100% 确定它是否适用于 PyQt5,但我想应该可以(可能需要进行一些小的修改,例如导入 PyQt5 而不是 PyQt4)。

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.label = QtGui.QLabel(self)
        self.label.resize(800, 600)
        pixmap1 = QtGui.QPixmap("image.png")
        self.pixmap = pixmap1.scaled(self.width(), self.height())
        self.label.setPixmap(self.pixmap)
        self.label.setMinimumSize(1, 1)

    def resizeEvent(self, event):
        pixmap1 = QtGui.QPixmap("image.png")
        self.pixmap = pixmap1.scaled(self.width(), self.height())
        self.label.setPixmap(self.pixmap)
        self.label.resize(self.width(), self.height())

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    window.resize(800, 600)
    sys.exit(app.exec_())

对你来说最重要的是resizeEvent的定义。您可以使用已经定义的self.pixmap 并调整它的大小,但是图像的质量会随着您使用的调整大小而降低。因此,最好总是创建新的pixmap,缩放到Window 的当前widthheight

【讨论】:

    【解决方案2】:

    无需在单独的QWidget 内创建QLabel。您可以简单地继承QLabel 而不是QWidget。它会让你的代码更简单、更干净:

    class MyLabelPixmap(QtWidgets.QLabel):
        def __init__(self):
            QtWidgets.QLabel.__init__(self)
            self.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
            self.resize(800, 600)
            self.pixmap = QtGui.QPixmap("image.jpg")
            self.setPixmap(self.pixmap)
            self.installEventFilter(self)
    
        def eventFilter(self, source, event):
            if (source is self and event.type() == QtCore.QEvent.Resize):
                self.setPixmap(self.pixmap.scaled(self.size()))
            return super(Window, self).eventFilter(source, event)
    

    如果您想将 MyLabelPixmap 小部件嵌入到 QMainWindow 中,只需添加您的 QMainWindow.__init__

    self.myLabelPixmap = MyLabelPixmap()
    self.setCentralWidget(self.myLabelPixmap) 
    

    【讨论】:

    • 感谢您的回答 - 我接受了另一个,因为它是第一个,但仍然感谢!
    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2021-08-29
    • 2020-04-26
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多