В моем проекте я создаю три элемента: QCombobox, QLabel, QCheckbox из базы данных для каждого имени продукта (которые присваивают QLabel свое имя в виде текста). После этого я перечисляю эти элементы в QTableWidget. ...

0
Melikşah Öztürk 12 Янв 2021 в 15:20

1 ответ

Лучший ответ

Самый простой способ - создать список для виджетов и заполнить его каждой строкой виджетов, добавленных в виде кортежа.

Обратите внимание, что я немного изменил цикл for, чтобы сделать его более читабельным, а также переместил setRowCount() и setColumnCount() за его пределы, так как постоянная установка их в цикле с одинаковыми значениями бесполезна. .

Я также изменил ссылки на виджет, которые теперь являются локальными переменными, а не атрибутом экземпляра: при использовании циклов не имеет большого смысла перезаписывать атрибут экземпляра для каждого цикла, поскольку он всегда будет потерян на следующей итерации.

class my_app(QMainWindow):
    def __init__(self):
        super(my_app, self).__init__()
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
        self.list_products()
        self.ui.pushButton.clicked.connect(self.current_index)

        self.widgetList = []

    def list_products(self): 
        self.widgetList.clear()

        curs.execute("SELECT productName,productId FROM products_list")
        products=curs.fetchall()
        curs.execute("SELECT shipmentTime FROM shipmentTime ORDER BY id")
        shipmentTime=curs.fetchall()

        self.ui.productlist.setRowCount(len(products))
        self.ui.productlist.setColumnCount(3)

        for row, i in enumerate(products):
            label = QtWidgets.QLabel(i[0])
            combo = QtWidgets.QComboBox()
            combo.addItems(j[0] for j in shipmentTime)
            checkbox = QtWidgets.QCheckBox(i[1])
            checkbox.setObjectName(i[1])
            self.ui.productlist.setCellWidget(row, 0, checkbox)
            self.ui.productlist.setCellWidget(row, 1, label)
            self.ui.productlist.setCellWidget(row, 2, combo)

            self.widgetList.append((checkbox, label, combo))

    def current_index(self):
        for checkbox, label, combo in self.widgetList:
            if checkbox.isChecked():
                print(checkbox.objectName(), label.text(), combo.currentText())

Обратите внимание, что приведенное выше является наиболее простой (и, вероятно, более питонической) возможностью; вы можете сделать то же самое без списка и с помощью функций, предоставляемых QTableWidget, что более "Qt-onic" ;-):

    def current_index(self):
        for row in range(self.ui.productlist.rowCount()):
            checkbox = self.ui.productlist.cellWidget(row, 0)
            if isinstance(QtWidgets.QCheckBox) and checkbox.isChecked():
                label = self.ui.productlist.cellWidget(row, 1)
                combo = self.ui.productlist.cellWidget(row, 2)
                print(checkbox.objectName(), label.text(), combo.currentText())
0
musicamante 12 Янв 2021 в 15:23