Как разместить изображение в верхнем левом углу контейнера с возможностью потом скрыть его?

У меня есть контейнер color_box. Я бы хотел разместить в его левом верхнем углу небольшое изображение(примерно 30px*30px). Мне нужно, чтобы картинка всегда оставалась в этом углу(в контейнере будут еще другие виджеты), т.е. не меняла свое положение при масштабировании окна. Также мне очень важно знать, как скрыть это изображение. Пожалуйста, подскажите, как это сделать?

from PyQt5 import QtCore, QtGui, QtWidgets

class MyWindow(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(MyWindow, self).__init__(*args, **kwargs)

        self.resize(300, 400)

        self.box = QtWidgets.QHBoxLayout(self)

        self.container = QtWidgets.QWidget()
        self.container.setStyleSheet("background-color: yellow;")
        self.box.addWidget(self.container)
        self.color_box = QtWidgets.QVBoxLayout(self.container)

        btn = QtWidgets.QPushButton('Button')
        btn.setStyleSheet("background-color: red;")
        self.color_box.addWidget(btn)

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

Ответы (2 шт):

Автор решения: Alexander Chernin

Вам нужна полоса, горизонтально группирующая виджеты:

# виджет-полоса
band = QWidget()

# Горизонталный лейаут
layout = QHBoxLayout()

# Метка для иконки
iconLabel = QLabel()
icon = QPixmap("пусть к картинке 30х30")
iconLabel.setPixmap(icon)

# Спейсер - служит для того, чтобы прижать виджеты к одной из сторон
# В нашем случае к левому краю
spacer = QSpacerItem(20, 20, QSizePolicy.Expanding) # расширяться горизонтально

# Добавляем необходимые виджеты
layout.addWidget(iconLabel)
...
# Спейсер должен идти последним
layout.addItem(spacer)

# устанавливаем лейаут в наш виджет
band.setLayout(layout)

Теперь необходимо поместить band в нужный контейнер, как я понимаю, в его верхнюю часть

→ Ссылка
Автор решения: S. Nick

Попробуйте так:

from PyQt5 import QtCore, QtGui, QtWidgets

class MyWindow(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(MyWindow, self).__init__(*args, **kwargs)

        self.resize(300, 400)

        self.label = QtWidgets.QLabel()
        self.label.setPixmap(QtGui.QPixmap('head3.png').scaled(30, 30))

        self.box = QtWidgets.QHBoxLayout(self)

        self.container = QtWidgets.QWidget()
        self.container.setStyleSheet("background-color: yellow;")
        self.box.addWidget(self.container)

        self.color_box = QtWidgets.QVBoxLayout(self.container)

        self.btn = QtWidgets.QPushButton('Button')
        self.btn.setCheckable(True)
        self.btn.click()
        self.btn.clicked.connect(self.onClicked)
        self.btn.setStyleSheet("background-color: red;")

        self.color_box.addWidget(self.label, alignment=QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
        self.color_box.addWidget(self.btn, alignment=QtCore.Qt.AlignBottom)

    def onClicked(self, state):
        if state:
            self.label.show()
        else:
            self.label.hide()        

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

введите сюда описание изображения


Update

Но можно ли поместить картинку так, чтобы картинка полностью прижалась к краям контейнера?

А можно ли сделать так, чтобы к краям прижалось только изображение, а другие виджеты в контенере остались на своих местах?


from PyQt5 import QtCore, QtGui, QtWidgets

class MyWindow(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(MyWindow, self).__init__(*args, **kwargs)
        self.resize(300, 400)

        self.label = QtWidgets.QLabel()
        self.label.setPixmap(QtGui.QPixmap('head3.png').scaled(30, 30))

        self.box = QtWidgets.QHBoxLayout(self)

        self.container = QtWidgets.QWidget()
        self.container.setStyleSheet("background-color: yellow;")
        self.box.addWidget(self.container)

        self.color_box = QtWidgets.QVBoxLayout(self.container)
        self.color_box.setContentsMargins(0, 0, 0, 20)                   # +++

        self.btn = QtWidgets.QPushButton('Button')
        self.btn.setFixedWidth(200)                                      # +++
        self.btn.setCheckable(True)
        self.btn.click()
        self.btn.clicked.connect(self.onClicked)
        self.btn.setStyleSheet("background-color: red;")

        self.color_box.addWidget(self.label, alignment=QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
        self.color_box.addWidget(self.btn, alignment=QtCore.Qt.AlignBottom | QtCore.Qt.AlignCenter) # +++

    def onClicked(self, state):
        if state:
            self.label.show()
        else:
            self.label.hide()        


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

введите сюда описание изображения

→ Ссылка