Я создаю табличный виджет, который отображает изображение, имя файла и две области выбора ящиков. У меня есть два объекта: 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 и добавил кнопку, чтобы изменить одно из значений региона для имитации ситуация. Может предоставить дополнительный код при необходимости. Заранее спасибо!