PyQt5中如何将列判断的OR逻辑替换为AND逻辑?
问题说明
我有如下数据结构:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | name_x | 14 | 15 | 16 | name_y |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | Brak | CD | CD | CD | Brak |
| CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | CD | Brak |
当前代码的判断逻辑是检查列13(name_x)或列17(name_y)中是否包含"Brak"字符串,这会导致后续功能无法执行。我需要改写代码,实现任意行中列13和列17同时包含"Brak"字符串的判断逻辑。我使用的是QTableWidget和Sqlite数据库,现有代码如下:
self.connection = sqlite3.connect(r'Baza Danych/zestawienie.db') self.c = self.connection.cursor() query = "SELECT * FROM Zestawienie" result = self.connection.execute(query) self.ui.zestawienie_analiza_tab_2.setRowCount(0) for row_number, row_data in enumerate(result): self.ui.zestawienie_analiza_tab_2.insertRow(row_number) for column_number, data in enumerate(row_data): self.ui.zestawienie_analiza_tab_2.setItem(row_number, column_number,QTableWidgetItem(str(data))) if column_number in(13,17) : if "Brak" in data: break else: for i in range(self.ui.zestawienie_analiza_tab_2.columnCount()): for j in range(self.ui.zestawienie_analiza_tab_2.rowCount()): self.ui.zestawienie_analiza_tab_2.layout = QtWidgets.QHBoxLayout() img = r"IKONY\letter_k.png" img2 = r"IKONY\warning.png" lb = CustomWidget(str(i)+str(j), img) self.ui.zestawienie_analiza_tab_2.layout.addStretch(1) lb2 = CustomWidget(str(i)+str(j), img2) self.ui.zestawienie_analiza_tab_2.layout.addWidget(lb) self.ui.zestawienie_analiza_tab_2.layout.addWidget(lb2) self.ui.zestawienie_analiza_tab_2.cellWidget = QtWidgets.QWidget() self.ui.zestawienie_analiza_tab_2.cellWidget.setLayout(self.ui.zestawienie_analiza_tab_2.layout) self.ui.zestawienie_analiza_tab_2.layout.setContentsMargins(0,0,0,0) self.ui.zestawienie_analiza_tab_2.layout.setSpacing(0) self.ui.zestawienie_analiza_tab_2.setCellWidget(row_number, 1, self.ui.zestawienie_analiza_tab_2.cellWidget)
修改后的代码
self.connection = sqlite3.connect(r'Baza Danych/zestawienie.db') self.c = self.connection.cursor() query = "SELECT * FROM Zestawienie" result = self.connection.execute(query) self.ui.zestawienie_analiza_tab_2.setRowCount(0) for row_number, row_data in enumerate(result): self.ui.zestawienie_analiza_tab_2.insertRow(row_number) # 先完成整行数据的表格填充 for column_number, data in enumerate(row_data): self.ui.zestawienie_analiza_tab_2.setItem(row_number, column_number, QTableWidgetItem(str(data))) # 检查目标列是否同时包含"Brak"(注意Python索引从0开始,列13对应索引12,列17对应索引16) name_x = row_data[12] name_y = row_data[16] if "Brak" in name_x and "Brak" in name_y: # 创建并设置单元格控件 layout = QtWidgets.QHBoxLayout() img = r"IKONY\letter_k.png" img2 = r"IKONY\warning.png" lb = CustomWidget(f"{row_number}_col1", img) layout.addStretch(1) lb2 = CustomWidget(f"{row_number}_col1", img2) layout.addWidget(lb) layout.addWidget(lb2) cell_widget = QtWidgets.QWidget() cell_widget.setLayout(layout) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.ui.zestawienie_analiza_tab_2.setCellWidget(row_number, 1, cell_widget)
修改要点
- 调整判断逻辑:将原有的"或"判断改为"且"判断,并且移到整行数据填充完成后执行,避免中途break打断后续操作。
- 修正索引对应:原代码列号是1开始计数,Python列表索引从0开始,所以列13对应索引12,列17对应索引16。
- 简化冗余操作:去掉原代码中不必要的全行列遍历,只针对当前符合条件的行创建控件,避免重复执行。
- 规范变量使用:避免直接给QTableWidget实例绑定layout、cellWidget属性,改用局部变量,防止污染控件实例的内置属性。
内容的提问来源于stack exchange,提问作者Sebastian Kasperski
相关产品推荐
相关产品推荐

