python - 在调整窗口大小的同时保持 QLabel 中图像的纵横比

标签 python layout pyqt5 qlabel qpixmap

假设我有这样的布局:

enter image description here

我希望左侧对象和右侧对象的比例始终是这样的: enter image description here

这样我就可以在左上角添加一个小图像,该图像不会太大或太小,但始终与窗口的大小保持良好的关系。我怎样才能做到这一点,无论是在设计器中还是在代码中?

我已经发现您似乎能够通过选择布局并更改 LayoutStretch 来做到这一点类似 1,3 - 这在设计器中有效,但是,当我在代码中插入图像时,它不尊重它并再次使布局失控。

我添加了一个担架并使用QLabel来显示图像,然后通过self.LogoLabel.setPixmap(QtGui.QPixmap('res/image.png'))添加文件,所以我不明白我需要更改什么才能使左上角的图像始终保持美观和小。

一个测试示例,以防问题不够清楚 - 我需要的图像是 1000x710px 大。

from PyQt5 import QtCore, QtWidgets, QtGui
import sys

class Ui_ZEBRA(object):

    def setupUi(self, ZEBRA):
        ZEBRA.setObjectName("ZEBRA")
        ZEBRA.resize(315, 134)
        self.centralwidget = QtWidgets.QWidget(ZEBRA)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(-1, -1, -1, 0)
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.LogoLabel = QtWidgets.QLabel(self.centralwidget)
        self.LogoLabel.setText("")
        self.LogoLabel.setScaledContents(True)
        self.LogoLabel.setObjectName("LogoLabel")
        self.verticalLayout_3.addWidget(self.LogoLabel)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_3.addItem(spacerItem)
        self.ComboBox_InputType = QtWidgets.QComboBox(self.centralwidget)
        self.ComboBox_InputType.setObjectName("ComboBox_InputType")
        self.ComboBox_InputType.addItem("")
        self.ComboBox_InputType.addItem("")
        self.ComboBox_InputType.addItem("")
        self.ComboBox_InputType.addItem("")
        self.verticalLayout_3.addWidget(self.ComboBox_InputType)
        self.horizontalLayout.addLayout(self.verticalLayout_3)
        self.TextInput_Devices = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.TextInput_Devices.setObjectName("TextInput_Devices")
        self.horizontalLayout.addWidget(self.TextInput_Devices)
        self.horizontalLayout.setStretch(0, 1)
        self.horizontalLayout.setStretch(1, 3)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        ZEBRA.setCentralWidget(self.centralwidget)
        self.menuBar_EnterToken = QtWidgets.QAction(ZEBRA)
        self.menuBar_EnterToken.setObjectName("menuBar_EnterToken")
        self.menuBar_TestToken = QtWidgets.QAction(ZEBRA)
        self.menuBar_TestToken.setObjectName("menuBar_TestToken")
        self.menuBar_About = QtWidgets.QAction(ZEBRA)
        self.menuBar_About.setObjectName("menuBar_About")

        self.retranslateUi(ZEBRA)
        QtCore.QMetaObject.connectSlotsByName(ZEBRA)

    def retranslateUi(self, ZEBRA):
        _translate = QtCore.QCoreApplication.translate
        ZEBRA.setWindowTitle(_translate("ZEBRA", "ZEBRA"))
        self.ComboBox_InputType.setItemText(0, _translate("ZEBRA", "ip"))
        self.ComboBox_InputType.setItemText(1, _translate("ZEBRA", "Use all devices"))
        self.ComboBox_InputType.setItemText(2, _translate("ZEBRA", "displayName"))
        self.ComboBox_InputType.setItemText(3, _translate("ZEBRA", "id"))
        self.menuBar_EnterToken.setText(_translate("ZEBRA", "Enter Accesstoken"))
        self.menuBar_TestToken.setText(_translate("ZEBRA", "Test Accesstoken"))
        self.menuBar_About.setText(_translate("ZEBRA", "About..."))


class Test(QtWidgets.QMainWindow, Ui_ZEBRA):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.setupUi(self)
        self.LogoLabel.setPixmap(QtGui.QPixmap('res/image.png'))

def main():
    app = QtWidgets.QApplication(sys.argv)
    form = Test()
    form.show()
    app.exec_()



if __name__ == '__main__':
    main()

编辑:奇怪的是,我找不到关于如何在 QLabel 中使用图像并在更改窗口大小的同时缩放其大小,同时保持纵横比的单个工作示例。这么基本的东西竟然无处可寻?

最佳答案

您首先需要更改布局,以便使用对齐方式而不是扩展间隔符来将标签保持在左上角。此外,标签的某些属性需要调整,以便它可以自由调整自身大小。这一切都可以在 Qt Designer 中完成,但您的示例代码也可以手动修复,如下所示:

self.LogoLabel = QtWidgets.QLabel(self.centralwidget)
self.LogoLabel.setText("")
self.LogoLabel.setObjectName("LogoLabel")

# new stuff
self.LogoLabel.setScaledContents(False)
self.LogoLabel.setMinimumSize(1, 1)
self.LogoLabel.setSizePolicy(
    QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
self.LogoLabel.setAlignment(QtCore.Qt.AlignTop)
self.verticalLayout_3.setAlignment(QtCore.Qt.AlignTop)

self.verticalLayout_3.addWidget(self.LogoLabel)

然后可以使用事件过滤器来处理动态调整大小,如下所示:

class Test(QtWidgets.QMainWindow, Ui_ZEBRA):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.setupUi(self)
        self._logo = QtGui.QPixmap('res/image.png')
        self.LogoLabel.setPixmap(self._logo)
        self.LogoLabel.installEventFilter(self)

    def eventFilter(self, widget, event):
        if event.type() == QtCore.QEvent.Resize and widget is self.LogoLabel:
            self.LogoLabel.setPixmap(self._logo.scaled(
                self.LogoLabel.width(), self.LogoLabel.height(),
                QtCore.Qt.KeepAspectRatio))
            return True
        return super(Test, self).eventFilter(widget, event)

关于python - 在调整窗口大小的同时保持 QLabel 中图像的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68484199/

相关文章:

python - grequests 忽略 ssl 错误

python生成器时间复杂度混淆

Python - 从变量中提取数据的正则表达式

python - 来自 Numpy 数组的 PyQt5 QImage

python - 到 PyQt5 'connect' 转换

python - python 中 TfidfVectorizer 中 n-gram 的标记模式

layout - SSRS 中的表未对齐

css - 灵活的布局以适应浏览器的宽度

android - 切换 View /布局

javascript - 从javascript返回值到pyqt5