Назначение QTableWidget выпадающему списку QComboBox
Подскажите пожалуйста, как можно на каждый элемент выпадающего списка назначить QTableWidget, чтобы при выборе элемента из выпадающего списка появлялась таблица с характеристиками выбранного элемента (которую я заполню позже).
Например, в Combobox I выбираю марку автомобиля, появляется таблица, которую я заполняю.
Буду благодарен за помощь.
PS. Я в курсе, что в сгенерированном классе нельзя писать код, публикую просто как рабочий пример.
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1920, 1000)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(10, 40, 131, 20))
self.lineEdit.setInputMask("")
self.lineEdit.setText("")
self.lineEdit.setPlaceholderText("1")
self.lineEdit.textChanged.connect(self.add1)
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(10, 100, 131, 20))
self.lineEdit_2.setInputMask("")
self.lineEdit_2.setPlaceholderText("4")
self.lineEdit_2.textChanged.connect(self.add2)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(280, 250, 119, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("1")
self.comboBox.addItem("2")
self.comboBox.addItem("3")
self.comboBox.addItem("4")
self.comboBox.addItem("5")
self.comboBox.addItem("6")
self.comboBox.addItem("7")
self.comboBox.addItem("8")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(200, 0, 1720, 1000))
Row = 35
self.row = Row
Col = 7
self.tableWidget.setRowCount(Row)
self.tableWidget.setColumnCount(Col)
self.tableWidget.setObjectName("tableWidget")
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(237)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1920, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
for column in range(Col):
for row in range(Row):
s = self.lineEdit.setText("")
item = QtWidgets.QTableWidgetItem(s)
self.tableWidget.setItem(row, column, item)
for a in range(7):
for b in range(Row):
c = self.lineEdit_2.setText("")
i1 = QtWidgets.QTableWidgetItem(c)
self.tableWidget.setItem(a, b, i1)
def add1(self, s):
for row in range(self.row):
if self.tableWidget.item(row,0).text() == s:
self.tableWidget.editItem(self.tableWidget.item(row, 0))
def add2(self, c):
itims = self.tableWidget.findItems(c, QtCore.Qt.MatchContains)
if itims:
self.tableWidget.setCurrentItem(itims[0])
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "2"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "4"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "5"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "6"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "7"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (1 шт):
НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
Как вариант.
Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1920, 1000)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(10, 40, 131, 20))
self.lineEdit.setInputMask("")
self.lineEdit.setText("")
self.lineEdit.setPlaceholderText("PlaceholderText 1")
# self.lineEdit.textChanged.connect(self.add1)
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(10, 100, 131, 20))
self.lineEdit_2.setInputMask("")
self.lineEdit_2.setPlaceholderText("PlaceholderText 4")
# self.lineEdit_2.textChanged.connect(self.add2)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(280, 250, 119, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("Сделайте выбор")
self.comboBox.addItem("1")
self.comboBox.addItem("2")
self.comboBox.addItem("3")
self.comboBox.addItem("4")
self.comboBox.addItem("5")
self.comboBox.addItem("6")
self.comboBox.addItem("7")
self.comboBox.addItem("8")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(200, 0, 1220, 500))
Row = 35
self.row = Row
Col = 7
self.tableWidget.setRowCount(Row)
self.tableWidget.setColumnCount(Col)
self.tableWidget.setObjectName("tableWidget")
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(237)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1920, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
''' ???
for column in range(Col):
for row in range(Row):
s = self.lineEdit.setText("")
item = QtWidgets.QTableWidgetItem(s)
self.tableWidget.setItem(row, column, item)
for a in range(7):
for b in range(Row):
c = self.lineEdit_2.setText("")
i1 = QtWidgets.QTableWidgetItem(c)
self.tableWidget.setItem(a, b, i1)
'''
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "2"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "4"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "5"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "6"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "7"))
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.lineEdit.textChanged.connect(self.add1)
self.lineEdit_2.textChanged.connect(self.add2)
self.tableWidget_1 = QtWidgets.QTableWidget(3, 3) # +++
self.tableWidget_2 = QtWidgets.QTableWidget(4, 4) # +++
self.tableWidget_3 = QtWidgets.QTableWidget(5, 5) # +++
self.tableWidget_4 = QtWidgets.QTableWidget(6, 3) # +++
self.tableWidget_5 = QtWidgets.QTableWidget(7, 3) # +++
self.tableWidget_6 = QtWidgets.QTableWidget(8, 2) # +++
self.tableWidget_7 = QtWidgets.QTableWidget(8, 4) # +++
self.tableWidget_8 = QtWidgets.QTableWidget(9, 6) # +++
self.stacked_widget = QtWidgets.QStackedWidget() # !!! +++
self.stacked_widget.addWidget(self.tableWidget)
self.stacked_widget.addWidget(self.tableWidget_1)
self.stacked_widget.addWidget(self.tableWidget_2)
self.stacked_widget.addWidget(self.tableWidget_3)
self.stacked_widget.addWidget(self.tableWidget_4)
self.stacked_widget.addWidget(self.tableWidget_5)
self.stacked_widget.addWidget(self.tableWidget_6)
self.stacked_widget.addWidget(self.tableWidget_7)
self.stacked_widget.addWidget(self.tableWidget_8)
self.comboBox.activated.connect(self.stacked_widget.setCurrentIndex) # !!! +++
layout = QGridLayout(self.centralwidget)
layout.addWidget(self.lineEdit, 1, 0)
layout.addWidget(self.lineEdit_2, 2, 0)
layout.addWidget(self.comboBox, 3, 0)
layout.addWidget(self.stacked_widget, 0, 1, 5, 1)
layout.setColumnStretch(0, 0)
layout.setColumnStretch(1, 1)
def add1(self, s):
for row in range(self.row):
item = self.tableWidget.item(row, 0)
if item and item.text() == s:
self.tableWidget.editItem(self.tableWidget.item(row, 0))
def add2(self, c):
itims = self.tableWidget.findItems(c, QtCore.Qt.MatchContains)
if itims:
self.tableWidget.setCurrentItem(itims[0])
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(910, 505)
w.show()
sys.exit(app.exec_())

