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