如何访问动态创建的tablewidget?

How to access dynamically created tablewidget?

在我的项目中,我从数据库中为每个产品名称创建了三个项目:QCombobox、QLabel、QCheckbox(将自身名称作为文本提供给 QLabel)。之后,我在 QTableWidget 中列出这些项目。我想要做的是到达选定的 QCheckbox 行的 QLabel 文本和同一行的 QCombobox 的当前索引。

我可以访问 QTableWidget 的选定 QCheckbox,但我不知道如何访问 QCheckbox 行的其他项目。

函数是current_index,应该returnQLabel的文本和QCheckbox的文本。

import sys
from PyQt5 import QtWidgets,QtGui,QtCore
from PyQt5.QtWidgets import QLabel,QMainWindow,QApplication,QHeaderView,QTableWidgetItem,QMessageBox,QWidget
from uretim_sayfasi import Ui_MainWindow
import mysql.connector
global curs
global conn

conn=mysql.connector.connect(
    host="*****",
    user="****",
    password="*****",
    database="****"
    )
curs=conn.cursor()

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)

    def list_products(self):
        curs.execute("SELECT productName,productId FROM products_list")
        products=curs.fetchall()
        curs.execute("SELECT shipmentTime FROM shipmentTime ORDER BY id")
        shipmentTime=curs.fetchall()
        c=0
        for i in products:
            self.ui.productlist.setRowCount(int(c + 1))
            self.ui.productlist.setColumnCount(3)
            e=QtWidgets.QLabel()
            e.setText(i[0])
            self.combo=QtWidgets.QComboBox()
            self.combo.addItems(j[0] for j in shipmentTime)
            self.checkbox=QtWidgets.QCheckBox(i[1])
            self.checkbox.setObjectName(i[1])
            self.ui.productlist.setCellWidget(c,2,self.combo)
            self.ui.productlist.setCellWidget(c,0,self.checkbox)
            self.ui.productlist.setCellWidget(c,1,e)

            c+=1


    def current_index(self):
        items=self.ui.productlist.findChildren(QtWidgets.QCheckBox)
        for i in items:
            if i.isChecked():
                n=i.objectName()
                print(n)

def app():
    app=QApplication(sys.argv)
    win=my_app()
    win.show()
    sys.exit(app.exec_())

app()

the result table 在我的 senario 中,当单击按钮时,它应该 return 选择 QCheckbox 的(ARG.YI.2002 和 ARG.YI.2021)QLabel 的文本 **(ARG.YI.2002 的“KREMA”和 ARG.YI.2021 的“CEVİZİÇİ EXTRA”)** 和 QCombobox 的当前文本 (ARG.YI.2002 的“5 GÜN”和 ARG.YI.2021 的“1 GÜN” ).

最简单的方法是为小部件创建一个列表,并用作为元组添加的每一行小部件填充它。

请注意,我稍微更改了 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())

请注意,以上是最基本的(可能更像 pythonic)可能性;你可以在没有列表的情况下使用 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())