Как сделать чтобы при выборе значения 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 шт):
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_())
