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

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

Внизу приведен пример создания таблицы с QCombobox в QTableWidget, по нажатию кнопки добавляются строки.

При выборе значения пользователем значения в QCombobox, хочу чтобы срабатывал метод “show_message()”, который показывает сообщение, какой QCombobox сработал и вывести его значение «Продано» или «В наличии» внутри сообщения, а так же знать в какой строке выбран 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.layout.addWidget(self.button_1)

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

    self.button_1.clicked.connect(self.show_message)

def add_cells(self):  # метод для добавления строки и ячеек
    self.tableWidget.setRowCount(self.row_count)
    self.tableWidget.setItem(self.table_index, 0,
                             QtWidgets.QTableWidgetItem('Nokia'))

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

    self.tableWidget.setCellWidget(self.table_index, 1, combobox)  # Добавляю строки по итерации
    self.row_count += 1
    self.table_index += 1

def show_message(self):
    msg = QMessageBox()
    msg.setWindowTitle('Выбран вариант Combobox')
    msg.setText('Вы выбрали значение "ТЕКСТ QCombobox (Продано или В наличии"')
    msg.setInformativeText('Вы выбрали QCombobox в строке "Номер строки"')
    msg.exec_()

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

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

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

void QComboBox::textActivated(const QString &text)

Этот сигнал отправляется, когда пользователь выбирает элемент в поле со списком. Текст элемента передается.
Обратите внимание, что этот сигнал отправляется, даже если выбор не изменен. Если вам нужно знать, когда выбор действительно изменится, используйте сигнал currentIndexChanged() или currentTextChanged().

Эта функция была введена в Qt 5.14.

Я не проверял логику вашего приложения, а добавил только сигнал и слот.

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.layout.addWidget(self.button_1)

        self.button.clicked.connect(self.add_cells)
#        self.button_1.clicked.connect(self.show_message)

    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('В наличии')
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        combobox.textActivated.connect(
            lambda text, row=row, cb=combobox : 
                   self.current_text(text, row, cb))
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self.tableWidget.setCellWidget(self.table_index, 1, combobox)  
        self.row_count += 1
        self.table_index += 1
    
    '''
    def show_message(self):
        msg = QMessageBox()
        msg.setWindowTitle('Выбран вариант Combobox')
        msg.setText('Вы выбрали значение "ТЕКСТ QCombobox (Продано или В наличии"')
        msg.setInformativeText('Вы выбрали QCombobox в строке "Номер строки"')
        msg.exec_()
    '''

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv       
    def current_text(self, text, row, cb):
        msg = QMessageBox()
        msg.setWindowTitle('Выбран вариант Combobox')
        msg.setText(f'Вы выбрали значение: {text}')
        msg.setInformativeText(f'Вы выбрали QCombobox в строке: {row}')
        msg.exec_()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

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

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

→ Ссылка