kan3k1k3n
@kan3k1k3n

Как правильно вставить картинку в таблицу PyQt5?

суть: есть таблица с животными и картинками к ним. так же есть диалоговое окно для добавления новых данных (имя, порода, возраст) и кнопка для добавления картинки. данные вставляются, только вот картинка встает не только что созданную строчку, а в верхнюю строчку таблицы. а должно быть так, чтобы картинка и свежие данные соответствовали
вот фрагмент кода:
def add_row_to_table(self, cat_id, name, gender, age, species, reserve, date_of_receipt, pickup_date, image_path):
        row_position = self.animals_table.rowCount()
        self.animals_table.insertRow(row_position)

        item_cat_id = QTableWidgetItem(cat_id)
        item_cat_id.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 0, item_cat_id)

        item_name = QTableWidgetItem(name)
        item_name.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 1, item_name)

        item_gender = QTableWidgetItem(gender)
        item_gender.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 2, item_gender)

        item_age = QTableWidgetItem(age)
        item_age.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 3, item_age)

        item_species = QTableWidgetItem(species)
        item_species.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 4, item_species)

        item_reserve = QTableWidgetItem(reserve)
        item_reserve.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 5, item_reserve)

        item_date_of_receipt = QTableWidgetItem(date_of_receipt)
        item_date_of_receipt.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 6, item_date_of_receipt)

        item_pickup_date = QTableWidgetItem(pickup_date)
        item_pickup_date.setTextAlignment(Qt.AlignCenter)
        self.animals_table.setItem(row_position, 7, item_pickup_date)

        pixmap = QPixmap(image_path)
        if not pixmap.isNull():
            label = QLabel()
            label.setPixmap(pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation))
            self.animals_table.setCellWidget(row_position, 8, label)

    def select_image(self, row):
        file_dialog = QFileDialog(self)
        file_dialog.setNameFilter("images (*.png *.jpg *.jpeg *.bmp)")
        file_dialog.setViewMode(QFileDialog.Detail)
        if file_dialog.exec_():
            file_path = file_dialog.selectedFiles()[0]
            pixmap = QPixmap(file_path)
            if not pixmap.isNull():
                label = QLabel()
                label.setPixmap(pixmap.scaled(50, 50, Qt.KeepAspectRatio, Qt.SmoothTransformation))
                self.animals_table.setCellWidget(row, 8, label)
                self.update_image_path_in_database(row, file_path)

    def update_image_path_in_database(self, row, image_path):
        try:
            animal_id = self.animals_table.item(row, 0).text()
            self.cursor.execute("UPDATE cats_admin_test SET image_path = %s WHERE cat_id = %s;",
                                (image_path, animal_id))
            self.connection.commit()
        except Exception as e:
            print(f'ошибка обновления пути к изображению в базе данных: {e}')

    def get_input(self):
        dialog = QDialog(self)
        dialog.setWindowTitle('добавление животного')
        dialog.resize(700, 100)

        name_input = QLineEdit()
        gender_input = QLineEdit()
        age_input = QLineEdit()
        species_input = QLineEdit()
        reserve_input = QLineEdit()
        date_of_receipt_input = QLineEdit()
        pickup_date_input = QLineEdit()

        name_label = QLabel('имя:')
        gender_label = QLabel('вид:')
        age_label = QLabel('возраст:')
        species_label = QLabel('порода:')
        reserve_label = QLabel('зарезервирован(а):')
        date_of_receipt_label = QLabel('дата поступления:')
        pickup_date_label = QLabel('дата забора:')

        font = QFont('Gertrude', 9)
        name_label.setFont(font)
        gender_label.setFont(font)
        age_label.setFont(font)
        species_label.setFont(font)
        reserve_label.setFont(font)
        date_of_receipt_label.setFont(font)
        pickup_date_label.setFont(font)

        layout = QFormLayout()
        layout.addRow(name_label, name_input)
        layout.addRow(gender_label, gender_input)
        layout.addRow(age_label, age_input)
        layout.addRow(species_label, species_input)
        layout.addRow(reserve_label, reserve_input)
        layout.addRow(date_of_receipt_label, date_of_receipt_input)
        layout.addRow(pickup_date_label, pickup_date_input)

        select_image_button = QPushButton('выбрать изображение')
        select_image_button.clicked.connect(self.select_image)


        layout.addWidget(select_image_button)

        button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        def handle_close():
            dialog.accept()

        button_box.accepted.connect(handle_close)
        button_box.rejected.connect(dialog.reject)

        layout.addWidget(button_box)
        dialog.setLayout(layout)

        if dialog.exec_() == QDialog.Accepted:
            name = name_input.text().strip()
            gender = gender_input.text().strip()
            age = age_input.text().strip()
            species = species_input.text().strip()
            reserve = reserve_input.text().strip()
            date_of_receipt = date_of_receipt_input.text().strip()
            pickup_date = pickup_date_input.text().strip()
            return name, gender, age, species, reserve, date_of_receipt, pickup_date, True
        else:
            return '', '', '', '', '', '', '', False


p.s знаю, что проблема в том, что я передаю просто позицию строки в
self.animals_table.setCellWidget(row_position, 8, label)

но не могу этого решить. должна передаваться позиция именно только что созданной строки с новыми данными.
помогите, пожалуйста, сделать это
  • Вопрос задан
  • 28 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы