if len(data) != 0 and len(data[0]) != 0: self.tableWidget.setRowCount(len(data)) self.tableWidget.setColumnCount(len(data[0])) for i in range(len(data)): for j in range(len(data[0])): self.tableWidget.setItem(i, j, QTableWidgetItem(str(data[i][j])))
时间: 2023-05-22 08:07:16 浏览: 69
这段代码的作用是什么?
这段代码的作用是将数据填充到 Qt 的表格控件中。具体来说,它通过检查数据是否为空以及是否至少有一行一列的数据来确定需要设置表格的行数和列数。然后,它使用嵌套的 for 循环遍历数据,并将每个数据元素转换为一个字符串,然后将其放置到表格的对应单元格中。
相关问题
def list1_selected_items(self): selected_items = self.listWidget.selectedItems() list_1 = [item.text() for item in selected_items] print(list_1) for item in list_1: self.tableWidget.setRowCount(0) for i in range(20): data0 = worksheet02.cell(i+2, 2).value if data0 == item: print(data0) for j in range(5): room_name = worksheet02.cell(i+2, j+3).value if room_name == None: pass else: print(room_name) row = self.tableWidget.rowCount() self.tableWidget.insertRow(row) self.tableWidget.setItem(row, 0, QTableWidgetItem(room_name));在以上代码中,为什么当listwidget多选时,tablewidget只添加了其中一个的对于内容
根据代码,每次执行`self.tableWidget.setRowCount(0)`都会将表格的行数设为0,所以每次循环添加数据时都会覆盖之前的数据,导致只显示了最后一个选中项的内容。解决方法是在循环添加数据前,先将表格的行数设为选中项的总数,即`self.tableWidget.setRowCount(len(list_1))`。这样就能保证每个选中项对应的内容都能添加到表格中。
def query_data(self, new_window): # 获取输入框中的数据 data = self.input_box.text().split(",") if len(data) != 2 or not all(map(lambda x: x.strip(), data)): self.status_label.setText("输入格式错误!请按照 部门/姓名/性别/职位/工号/状态,对象 格式输入。") return # 执行 SQL 查询语句 sql = "select * from Staff where {} = (?)".format(data[0]) self.cursor.execute(sql, (data[1],)) # 获取查询结果并显示在表格中 rows = self.cursor.fetchall() self.table = QTableWidget() if rows: self.table.setRowCount(len(rows)) self.table.setColumnCount(len(rows[0])) for i, row in enumerate(rows): for j, col in enumerate(row): item = QTableWidgetItem(str(col)) self.table.setItem(i, j, item) self.table.setHorizontalHeaderLabels(["部门", "姓名", "性别", '职位', '工号', '状态']) self.table.horizontalHeader().setVisible(True) # 添加表格到新窗口中 self.v_layout = QVBoxLayout(new_window) self.v_layout.addWidget(self.table) new_window.setLayout(self.v_layout) new_window.show()如何解决这个问题
看起来你没有明确地声明self.table属性。这可能是导致问题的原因。你可以在类的__init__函数中声明self.table,如下所示:
```
def __init__(self):
super().__init__()
self.table = None
```
然后在query_data函数中,你可以检查self.table是否已经存在。如果它已经存在,你可以从父布局中删除它,然后重新设置它的内容。这里是修改后的代码:
```
def query_data(self, new_window):
# 获取输入框中的数据
data = self.input_box.text().split(",")
if len(data) != 2 or not all(map(lambda x: x.strip(), data)):
self.status_label.setText("输入格式错误!请按照 部门/姓名/性别/职位/工号/状态,对象 格式输入。")
return
# 检查 self.table 是否已经存在
if self.table:
self.v_layout.removeWidget(self.table)
self.table = None
# 执行 SQL 查询语句
sql = "select * from Staff where {} = (?)".format(data[0])
self.cursor.execute(sql, (data[1],))
# 获取查询结果并显示在表格中
rows = self.cursor.fetchall()
self.table = QTableWidget()
if rows:
self.table.setRowCount(len(rows))
self.table.setColumnCount(len(rows[0]))
for i, row in enumerate(rows):
for j, col in enumerate(row):
item = QTableWidgetItem(str(col))
self.table.setItem(i, j, item)
self.table.setHorizontalHeaderLabels(["部门", "姓名", "性别", '职位', '工号', '状态'])
self.table.horizontalHeader().setVisible(True)
# 添加表格到新窗口中
self.v_layout.addWidget(self.table)
new_window.setLayout(self.v_layout)
new_window.show()
```
这样,当你多次调用query_data函数时,就不会出现上述问题了。