from PyQt5.QtGui import QColor, QBrush from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QMainWindow, QTableWidgetItem from LaserMethaneUI import Ui_MainWindow class UiMain(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.quick_num = 99 # 串口通道表格设置 self.plainTextEditReceive.setMaximumBlockCount(5000) # 设置最大行数 self.tableWidgetSerChannel.setRowCount(20) # 建立表格解析并显示hex self.tableWidget.setRowCount(self.quick_num) for i in range(self.quick_num): # 从0到20 item = QTableWidgetItem() item.setCheckState(0) self.tableWidget.setItem(i, 0, item) def add_item_ser_channel(self, port_name): row_count = self.tableWidgetSerChannel.rowCount() # 获取表格的行数 # 检查 port_name 是否已经存在于表格中 for i in range(row_count): item = self.tableWidgetSerChannel.item(i, 1) # 假设 port_name 在第2列(索引为2) if item and item.text() == port_name: print(f"{port_name} 已经存在于表格中") return # 找到第一个空白行 for i in range(row_count): item = self.tableWidgetSerChannel.item(i, 1) # 假设 port_name 在第三列(索引为2) if not item or not item.text(): # 在第一个空白行插入 port_name self.tableWidgetSerChannel.setItem(i, 1, QTableWidgetItem(port_name)) item = QTableWidgetItem() item.setCheckState(2) # 2 表示 Qt.Checked self.tableWidgetSerChannel.setItem(i, 0, item) green_brush = QBrush(QColor('green')) self.tableWidgetSerChannel.item(i, 0).setBackground(green_brush) print(f"{port_name} 已添加到表格中") return # 如果没有空白行,则在表格末尾添加一行并插入 port_name self.tableWidgetSerChannel.insertRow(row_count) self.tableWidgetSerChannel.setItem(row_count, 1, QTableWidgetItem(port_name)) item = QTableWidgetItem() item.setCheckState(2) # 2 表示 Qt.Checked self.tableWidgetSerChannel.setItem(row_count, 0, item) green_brush = QBrush(QColor('green')) self.tableWidgetSerChannel.item(row_count, 0).setBackground(green_brush) print(f"{port_name} 已添加到表格末尾") # 自动调整列宽 self.tableWidgetSerChannel.resizeColumnsToContents(1) def delete_item_ser_channel(self, port_name): row = self.find_port_row(port_name) if row is not None: self.tableWidgetSerChannel.removeRow(row) print(f"{port_name} 已从表格中删除") else: print(f"{port_name} 不存在于表格中") def find_port_row(self, port_name): """查找 port_name 在表格中的行位置""" row_count = self.tableWidgetSerChannel.rowCount() for i in range(row_count): item = self.tableWidgetSerChannel.item(i, 1) # 假设 port_name 在第2列(索引为1) if item and item.text() == port_name: return i return None def find_selected_ports(self): selected_name = [] for i in range(self.tableWidgetSerChannel.rowCount()): item = self.tableWidgetSerChannel.item(i, 0) if item and item.checkState() == 2: selected_name.append(self.tableWidgetSerChannel.item(i, 1).text()) return selected_name def select_ser_channel_all(self): for i in range(self.tableWidgetSerChannel.rowCount()): item = self.tableWidgetSerChannel.item(i, 0) if item: item.setCheckState(2) def select_ser_channel_none(self): for i in range(self.tableWidgetSerChannel.rowCount()): item = self.tableWidgetSerChannel.item(i, 0) if item: item.setCheckState(0) def clear_ser_channel(self): for i in range(self.tableWidgetSerChannel.rowCount()): item = self.tableWidgetSerChannel.item(i, 0) if item: item.setCheckState(0) green_brush = QBrush(QColor(255, 255, 255)) self.tableWidgetSerChannel.item(i, 0).setBackground(green_brush) self.tableWidgetSerChannel.setItem(i, 1, QTableWidgetItem("")) def set_background_color(self, row, col, color): """设置表格背景颜色""" item = self.tableWidgetSerChannel.item(row, col) self.tableWidgetSerChannel.setItem(row, col, item) brush = QColor(color) self.tableWidgetSerChannel.item(row, col).setBackground(brush) def update_table(self, port_name): # 更新串口通道表格 row_count = self.tableWidgetSerChannel.rowCount() for i in range(row_count): item = self.tableWidgetSerChannel.item(i, 1) if item and item.text() == port_name: item.setBackground(QColor(0, 255, 0)) # 设置颜色 break def update_table_status(self, ind, status, color): """更新表格单元格状态""" item = QTableWidgetItem(status) self.tableWidgetSerChannel.setItem(ind, 2, item) # 设置第三列(索引为2)的文本 brush = QColor(color) self.tableWidgetSerChannel.item(ind, 2).setBackground(brush) def reset_port_color(self, ind): """重置表格颜色""" item = QTableWidgetItem('') self.tableWidgetSerChannel.setItem(ind, 2, item) # 设置第三列(索引为2)的文本 item.setBackground(QColor(255, 255, 255)) def set_cursor_to_end(self): textCursor = self.plainTextEditReceive.textCursor() textCursor.movePosition(textCursor.End) self.plainTextEditReceive.setTextCursor(textCursor) def disp_hex_receive(self, hex_str_input): length = self.tableWidget.rowCount() try: for i in range(length): if self.tableWidget.item(i, 0).checkState() == 2: start = int(self.tableWidget.item(i, 1).text()) num = int(self.tableWidget.item(i, 2).text()) scale = int(self.tableWidget.item(i, 3).text()) hex_str_cut = hex_str_input[start * 2:(start + num) * 2] item = QTableWidgetItem(hex_str_cut) self.tableWidget.setItem(i, 4, item) value = int(hex_str_cut, 16) / scale item = QTableWidgetItem(str(value)) self.tableWidget.setItem(i, 5, item) except Exception as e: print(e) pass def set_disp_hex(self, row, col, str): self.tableWidget.setItem(row, col, QTableWidgetItem(str)) def get_disp_hex(self, row, col): return self.tableWidget.item(row, col).text() def set_disp_select(self,row,status): item = self.tableWidget.item(row, 0) # 先反读回来,再设置,不然text丢失 item.setCheckState(status) self.tableWidget.setItem(row, 0, item) def get_disp_select(self,row): return self.tableWidget.item(row, 0).checkState() if __name__ == '__main__': import sys app = QApplication(sys.argv) ui = UiMain() ui.show() sys.exit(app.exec_())