如何访问动态创建的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())
在我的项目中,我从数据库中为每个产品名称创建了三个项目: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())