Мне нужен совет относительно раскладок в QT / PyQt.
Я хочу добиться того, чтобы изображение отображалось, центрировалось, масштабировалось правильно, занимая как можно больше места, сохраняя при этом соотношение сторон. Это легко сделать используя это:
class Demo(QWidget):
def __init__(self) -> None:
super().__init__()
self.setWindowState(Qt.WindowMaximized)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.button = QPushButton("Next image")
self.label = QLabel()
self.label.setStyleSheet("QLabel { background-color : red; }")
self.label.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.label)
self.layout.addWidget(self.button)
self.button.clicked.connect(self.showImage)
self.show()
def showImage(self):
self.pixmap = QPixmap("image.jpg")
scaled = self.pixmap.scaled(self.label.size(), Qt.KeepAspectRatio)
self.label.setPixmap(scaled)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Demo()
sys.exit(app.exec_())
Проблема в том, что изображение будет отображаться по центру надписи, со значительным «лишним надписью» вокруг, см. Скриншот, красный цвет
Но мне нужно, чтобы Ярлык был точно размера изображения. Я хочу сделать несколько резиновых полос на изображении, чтобы выбрать их части (выбрать блоки для последующего использования в обучении ретинанетам) и рассчитать правильный размер блоков, которые мне нужны для mapToGlobal и mapFromGlobal. Я не могу сделать это из самого Pixmap (так как это не виджет), и когда я делаю это из Label, я получаю неправильные значения, так как он больше, чем фактическое изображение.
Теперь я мог бы использовать GridLayout или HBoxLayout с SpacerItems. Проблема в логике с этим. Размер метки (и SpacerItems определяется при загрузке пользовательского интерфейса. Когда я позже динамически добавляю изображение, оно масштабируется до размера метки, даже если оно может быть больше, если только SpacerItems «уступит дорогу»). сделайте ярлык. В результате вместо «слишком большого количества ярлыков» слева и справа у меня будет «слишком много ярлыков» сверху и снизу. Надеюсь, вы понимаете, о чем я.
Что я сейчас делаю:
- Изменение размера окна до разрешения экрана
- Добавить (масштабированное) изображение
- изменить размер (0,0)
После этого размер приложения изменяется так, что Labe точно соответствует размеру изображения (что я хочу), но это злой, хакерский, мерцающий, безумный способ сделать это; -)
EDIT:
Большое спасибо за ответ, @eyllanesc :-)
Я попробовал это, и это делает то, что я хочу для первой картины. Что я забыл упомянуть, так это то, что, когда первое изображение правильно «резиновой», после нажатия кнопки «Далее» отображается другое изображение. Если это изображение меньше, чем фактическая метка (или пейзаж вместо портрета), метка сжимается. И вот, после некоторых изображений с разным разрешением и ориентацией, Метка продолжает уменьшаться и уменьшаться ...
https://pastebin.com/ZMMw20Z7
https://giphy.com/gifs/xlou5RpQoX805fUymR