Как поменять значение QCombobox который создается в итерации без имени в QTableWidget по нажатию кнопки в другом окне, зная номер строки, где менялся

У меня создается по нажатию кнопки в итерации строки в таблице QTableWidget и в этих строках так же создается QCombobox со значениями «Продано» и «В наличии».

При выборе пользователем в любом QCombobox значения «В наличии», появляется окно, и я пытаюсь, когда пользователь в окне нажал «Ок», то значение в QCombobox возвращалось обратно в «Продано».

Я знаю, как установить значение, если при создании QCombobox указать явное имя экземпляру класса (QCombobox.setCurentIndex()).
Но, я не понимаю, как обратится QCombobox который создается в итерации без явного указания имени, в QTableWidget.

Вот мой код. В методе show_message() по нажатию кнопки я хочу вернуть значение QCombobox обратно в "Продано".

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, \
QVBoxLayout, QMessageBox


class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.row_count = 1
        self.table_index = 0

        self.tableWidget = QtWidgets.QTableWidget()
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(2)

        self.button = QtWidgets.QPushButton('Добавить строки таблицы')
        self.button_1 = QtWidgets.QPushButton('Вывести значение ячейки')

        self.layout = QVBoxLayout(self.centralWidget)
        self.layout.addWidget(self.tableWidget)
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.add_cells)


    def add_cells(self):
        row = self.tableWidget.rowCount()

        self.tableWidget.setRowCount(self.row_count)
        self.tableWidget.setItem(self.table_index, 0, QtWidgets.QTableWidgetItem(f'Nokia {self.table_index}'))

        combobox = QtWidgets.QComboBox()
        combobox.addItem('Продано')
        combobox.addItem('В наличии')

        combobox.currentTextChanged.connect(lambda text, row=row: self.show_message(text, row))

        self.tableWidget.setCellWidget(self.table_index, 1, combobox)
        self.row_count += 1
        self.table_index += 1


    def show_message(self, text, row): # всплывающее окно который принимает текст кнопки, и номер строки и выводит в сообщение
        if text == 'В наличии':
            msg = QMessageBox()
            msg.setInformativeText(f'Вернуть значение в строке {row} обратно?')
            msg.exec_()



if __name__ == '__main__':
  app = QApplication(sys.argv)
  w = MyWindow()
  w.show()
  sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Я увидел вашу задачу так:

import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, \
    QVBoxLayout, QMessageBox


class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.row_count = 1
        self.table_index = 0

        self.tableWidget = QtWidgets.QTableWidget()
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(2)

        self.button = QtWidgets.QPushButton('Добавить строки таблицы')
        self.button_1 = QtWidgets.QPushButton('Вывести значение ячейки')

        self.layout = QVBoxLayout(self.centralWidget)
        self.layout.addWidget(self.tableWidget)
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.add_cells)

    def add_cells(self):
        row = self.tableWidget.rowCount()
        self.tableWidget.setRowCount(self.row_count)
        self.tableWidget.setItem(
            self.table_index, 
            0, 
            QtWidgets.QTableWidgetItem(f'Nokia {self.table_index}')
        )

        combobox = QtWidgets.QComboBox()
        combobox.addItem('В наличии:')                            # +++
        combobox.addItem(f'Nokia_{self.table_index}_1')           # +++
        combobox.addItem(f'Nokia_{self.table_index}_2')           # +++
        combobox.addItem(f'Nokia_{self.table_index}_3')           # +++

        combobox.currentTextChanged.connect(
            lambda text, row=row, cb=combobox: self.show_message(text, row, cb))
# +++                             ^^^^^^^^^^^                               ^^
        self.tableWidget.setCellWidget(self.table_index, 1, combobox)
        self.row_count += 1
        self.table_index += 1

    # всплывающее окно который принимает текст кнопки, номер строки 
    # и cb выводит в сообщение
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
# +++                                 vv    
    def show_message(self, text, row, cb): 
        if text != 'В наличии:' and text != 'Продано':               # +++  
            msg = QMessageBox()
            msg.setInformativeText(f'Вы хотите купить {text} ?')     # +++ 
            msg.addButton(QMessageBox.Yes)                           # +++ 
            msg.addButton(QMessageBox.No)                            # +++ 
            bttn = msg.exec_()                                    # +++ bttn

            if bttn != QMessageBox.Yes:
                return
            
            row = cb.model().rowCount()
            for i in range(cb.model().rowCount()):
                t = cb.model().item(i, 0).text()
                if t == text:
                    cb.model().item(i, 0).setText('Продано')  
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            

if __name__ == '__main__':
  app = QApplication(sys.argv)
  w = MyWindow()
  w.show()
  sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка