Как разместить изображение в верхнем левом углу контейнера с возможностью потом скрыть его?
У меня есть контейнер 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 шт):
Вам нужна полоса, горизонтально группирующая виджеты:
# виджет-полоса
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 в нужный контейнер, как я понимаю, в его верхнюю часть
Попробуйте так:
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_())

