PyQt Image (pixmap) обрезается, когда другой контент меняет ширину в виджете - PullRequest
0 голосов
/ 28 августа 2018

Я создаю табличный виджет, который отображает изображение, имя файла и две области выбора ящиков. У меня есть два объекта: grid_row и grid_table (оба используют QGridLayout), grid_row представляет собой одну строку и grid_table содержит x количество grid_rows (я создаю это так, потому что мне проще отслеживать мои пользовательские свойства).

Инструмент выглядит так

Окончательный макет - это QVBoxLayout, затем сверху вниз, у меня есть QHBoxLayout (с меткой и комбинированным списком), grid_row (для заголовков 1,2,3), scroll_area, который содержит grid_table с каждым будучи grid_rows. Наконец, еще один QHBoxLayout для кнопок.

Каждый grid_row содержит 'image-widget' и две метки региона (QLabel). Виджет изображения содержит метку (я использовал setPixmap для отображения) и кнопку. Вот мои классы grid_row и image_widget:

class grid_row(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        #self.frame = frame_main()

        self.grid_layout = QGridLayout()
        self.grid_layout.setSpacing(50)

        self.image_widget = image_widget()

        self.grid_layout.addWidget(self.image_widget, 0, 0, 1, 1, Qt.AlignHCenter)


        self.region_2 = QLabel('null')
        self.grid_layout.addWidget(self.region_2, 0, 2, 1, 1, Qt.AlignHCenter)

        self.setLayout(self.grid_layout)

        self.region_1 = QLabel('null')
        self.grid_layout.addWidget(self.region_1, 0, 1, 1, 1, Qt.AlignHCenter)
class image_widget(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setAcceptDrops(True)
        self.image_widget_layout = QHBoxLayout()
        self.image_widget_label = QLabel()
        self.image_widget_label.setPixmap(QPixmap('default.png').scaled(96, 54))
        self.image_widget_layout.addWidget(self.image_widget_label)
        self.img_btn = QPushButton()
        self.img_btn.setEnabled(False)
        self.img_btn.setText('Drag Here!') 
        self.image_widget_layout.addWidget(self.img_btn)
        self.setLayout(self.image_widget_layout)
if __name__ == '__main__': 
    app = QApplication(sys.argv)
    widget = QWidget()
    layout = QVBoxLayout()
    grid_row = grid_row()
    layout.addWidget(grid_row)
    btn = QPushButton('press')
    btn.clicked.connect(lambda: grid_row.region_1.setText('[0,0,1920,1080]'))
    layout.addWidget(btn)
    widget.setLayout(layout)
    scroll_area = QScrollArea()
    scroll_area.setWidget(widget)
    scroll_area.show()
    sys.exit(app.exec_())

Итак, в настоящее время я реализовал события, которые позволяют мне перетаскивать изображения в image_widget и нажимать кнопку, чтобы изменить две области в рамке (формат: [x1, y1, x2, y2]). Проблема заключается в том, что когда я это делаю (например, значения регионов переходят от «ноль» к «[20, 20, 500, 500]»), изображение становится сплющенным, потому что теперь метки занимают большую ширину.

Я понимаю, что необходимо установить некоторую политику размера (и, возможно, другие свойства), но я не знаю, какое свойство использовать и для какого виджета. Я хочу, чтобы изображение осталось прежним. Может быть, вытянуть ширину каждого столбца для grid_row?

Чтобы уточнить, я хочу, чтобы метка, содержащая растровое изображение, оставалась одинакового размера (всегда 96 * 54) и полностью отображалась (не обрезалась и не растягивалась).

Я предоставил упрощенный исполняемый код для отображения моей проблемы, классы такие же, как мой код, я просто поместил grid_row внутри scroll_area и добавил кнопку, чтобы изменить одно из значений региона для имитации ситуация. Может предоставить дополнительный код при необходимости. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Ух ты, иногда ответ на самом деле одна дополнительная строка кода ... Таким образом, документация упоминает, что QScrollArea по умолчанию учитывает размер своего виджета. Вот почему, когда я изменил регион (на значение, которое шире / больше текста), виджет не настраивается автоматически.

Мне нужно было добавить

scroll_area.setWidgetResizable(True)

, чтобы разрешить виджету увеличиваться в размерах, вызывая появление полос прокрутки. Таким образом, мое растровое изображение не обрезается из-за недостатка места.

0 голосов
/ 28 августа 2018

Самый простой способ - добавить ограничения размера к метке перед добавлением в макет.

 self.image_widget_label.adjustSize()
 self.image_widget_label.setFixedSize(self.image_widget_label.size())
 self.image_widget_layout.addWidget(self.image_widget_label)

AdjustSize будет изменять размер метки в зависимости от содержимого.

Более сложный способ - ответить на вопросы:

"Когда я изменяю размер всего окна, как я хочу это конкретный предмет вести себя? Когда окно имеет минимальный размер, какие предметы я хочу скрыть или скрыть? Когда окно заполнено размер, где я хочу пустых пятен? "

Чтобы ответить на эти вопросы, прочитайте немного о Qt Layout management

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...