PyQt5 Pixmap в Label не изменяет размер - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий код, который меняет растровое изображение в метке через 3 секунды. Проблема заключается в том, что при изменении растрового изображения верхняя и нижняя часть нового изображения обрезаются, но они имеют тот же размер, что и предыдущий. Знаете ли вы, как этого избежать?

from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget, QHBoxLayout
from PyQt5.QtGui import QImage, QPalette, QBrush, QTransform
from PyQt5.QtCore import QSize

import sys
from datetime import datetime


PictureEthernet = 'E:\\ethernet.png'
PictureWifi0 = 'E:\\wifi_no.png'


class TopBar(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # NETWORK PICTURE
        self.labelNetwork = QtWidgets.QLabel()

        self.pictureNetwork = QtGui.QPixmap(PictureEthernet)
        self.pictureNetwork = self.pictureNetwork.scaled(20, 20, QtCore.Qt.IgnoreAspectRatio)
        self.labelNetwork.setPixmap(self.pictureNetwork)

        # BACKGROUND
        background = QtWidgets.QWidget(self)
        background.setStyleSheet("background-color: gray;")
        background.setGeometry(0, 0, 480, 30)

        # LAYOUT
        hbox = QHBoxLayout(background)
        hbox.addWidget(self.labelNetwork)


        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(3000)
        self.timer.timeout.connect(self.updateImage)
        self.timer.start()

        self.show()

    def updateImage(self):
        self.pictureNetwork = QtGui.QPixmap(PictureWifi0)
        self.pictureNetwork = self.pictureNetwork.scaled(20, 20, QtCore.Qt.KeepAspectRatio)
        self.labelNetwork.setPixmap(self.pictureNetwork)


if __name__=='__main__':
    app = QApplication(sys.argv)
    ex = TopBar()
    sys.exit(app.exec_())

первое изображение

второе изображение

ethe rnet .png

wifi_no.png

1 Ответ

0 голосов
/ 09 января 2020

Макеты имеют поля по умолчанию, размер которых зависит от ОС, который, например, в моем случае составляет 9 пикселей, поэтому при высоте «фона» 30 пикселей и вычитании верхнего и нижнего полей вы получаете оставшиеся 12 пикселей, которые меньше чем высота QPixmap размером 20px, в результате чего он выглядит обрезанным. В обоих QPixmap был разрез, но он более заметен в первом. Решение состоит в том, чтобы устранить верхние и нижние поля:

# ...
hbox = QHBoxLayout(background)
l, t, r, b = hbox.getContentsMargins()
hbox.setContentsMargins(l, 0, r, 0)
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...