import logging from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QColor, QBrush, QIcon from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem from LaserMethaneUI import Ui_MainWindow class UiMain(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.setWindowIcon(QIcon('favicon.ico')) self.quick_num = 99 # 串口通道表格设置 self.plainTextEditReceive.setMaximumBlockCount(5000) # 设置最大行数 self.tableWidgetSerChannel.setRowCount(20) self.tableWidgetSerChannel.setColumnWidth(0, 30) # 第一列宽度为50像素 self.tableWidgetSerChannel.setColumnWidth(1, 80) # 第二列宽度为150像素 self.tableWidgetSerChannel.setColumnWidth(2, 100) # 第三列宽度为100像素 self.tableWidgetSerChannel.verticalHeader().setDefaultSectionSize(25) # 自动调整列宽 self.tableWidgetNetChannel.resizeColumnsToContents() self.tableWidgetNetChannel.setColumnWidth(0, 90) # 第一列宽度为50像素 self.tableWidgetNetChannel.setColumnWidth(1, 120) # 第二列宽度为150像素 self.tableWidgetNetChannel.setColumnWidth(2, 100) # 第三列宽度为100像素 self.tableWidgetNetChannel.verticalHeader().setDefaultSectionSize(25) self.tableWidgetNetChannel.setSortingEnabled(True) # 自动调整列宽 # table_widget.resizeColumnsToContents() self.tableWidgetNetChannel.setRowCount(20) # 假设 tableWidgetNetChannel 也有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) # 建立快捷指令的表格 for i in range(self.quick_num): # 从0到20 index_str = f"{i:02}" # 确保编号为两位数字形式 horizontalLayoutName = f"horizontalLayoutQuick_{index_str}" horizontalLayout = QtWidgets.QHBoxLayout() horizontalLayout.setObjectName(horizontalLayoutName) # 创建 QLineEdit 并设置动态属性 lineEditName = f"lineEditQuick_{index_str}" setattr(self, lineEditName, QtWidgets.QLineEdit(self.layoutWidget)) getattr(self, lineEditName).setObjectName(lineEditName) horizontalLayout.addWidget(getattr(self, lineEditName)) # 创建 QPushButton 并设置动态属性 buttonName = f"pushButtonQuick_{index_str}" setattr(self, buttonName, QtWidgets.QPushButton(self.layoutWidget)) getattr(self, buttonName).setObjectName(buttonName) horizontalLayout.addWidget(getattr(self, buttonName)) self.verticalLayout_9.addLayout(horizontalLayout) #加载快捷指令 self.widget_2.hide() def add_item_channel(self, table_widget, port_name): if table_widget is None: raise ValueError("table_widget 不能为 None") row_count = table_widget.rowCount() inserted = False # 检查 port_name 是否已经存在于表格中 for i in range(row_count): item = table_widget.item(i, 1) if item and item.text() == port_name: logging.debug(f"{port_name} 已经存在于表格中") return # 找到第一个空白行并插入 port_name for i in range(row_count): item = table_widget.item(i, 1) if not item or not item.text(): self.insert_port_name(table_widget, i, port_name) inserted = True break # 如果没有空白行,则在表格末尾添加一行并插入 port_name if not inserted: table_widget.insertRow(row_count) self.insert_port_name(table_widget, row_count, port_name) def insert_port_name(self, table_widget, row_index, port_name): item = QTableWidgetItem(port_name) table_widget.setItem(row_index, 1, item) checkbox_item = QTableWidgetItem() checkbox_item.setCheckState(Qt.Checked) # 使用 Qt.Checked 提高可读性 table_widget.setItem(row_index, 0, checkbox_item) green_brush = QBrush(QColor('green')) table_widget.item(row_index, 0).setBackground(green_brush) logging.info(f"{port_name} 已添加到表格中") def set_checkbox_state(self, table_widget, port_name, state): row_index = self.find_port_row(table_widget, port_name) checkbox_item = QTableWidgetItem() checkbox_item.setCheckState(state) # 使用 Qt.Checked 提高可读性 table_widget.setItem(row_index, 0, checkbox_item) def delete_item_channel(self, table_widget, port_name): row = self.find_port_row(table_widget, port_name) if row is not None: table_widget.removeRow(row) print(f"{port_name} 已从表格中删除") else: print(f"{port_name} 不存在于表格中") def find_port_row(self, table_widget, port_name): """查找 port_name 在表格中的行位置""" row_count = table_widget.rowCount() for i in range(row_count): item = table_widget.item(i, 1) # 假设 port_name 在第2列(索引为1) if item and item.text() == port_name: return i return None def find_selected_ports(self, table_widget): selected_name = [] for i in range(table_widget.rowCount()): item = table_widget.item(i, 0) if item and item.checkState() == 2: selected_name.append(table_widget.item(i, 1).text()) return selected_name def find_all_ports(self, table_widget): all_name = [] for i in range(table_widget.rowCount()): item = table_widget.item(i, 1) if item: name = item.text() if name: all_name.append(name) return all_name def select_channel_all(self, table_widget): for i in range(len(self.find_all_ports(table_widget))): item = table_widget.item(i, 0) if item: item.setCheckState(2) def select_channel_none(self, table_widget): for i in range(len(self.find_all_ports(table_widget))): item = table_widget.item(i, 0) if item: item.setCheckState(0) # def clear_channel(self, table_widget): # for i in range(table_widget.rowCount()): # item = table_widget.item(i, 0) # if item: # item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable) # item.setCheckState(0) # green_brush = QBrush(QColor(255, 255, 255)) # table_widget.item(i, 0).setBackground(green_brush) # table_widget.setItem(i, 1, QTableWidgetItem("")) def clear_channel(self, table_widget): for i in range(len(self.find_all_ports(table_widget))): # 创建一个新的 QTableWidgetItem 并设置为不具有复选框属性 new_item = QTableWidgetItem() new_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) # 确保单元格可选中但不可编辑 new_item.setBackground(QBrush(QColor(255, 255, 255))) table_widget.setItem(i, 0, new_item) for i in range(table_widget.rowCount()): table_widget.setItem(i, 1, QTableWidgetItem("")) green_brush = QBrush(QColor(255, 255, 255)) table_widget.setItem(i, 2, QTableWidgetItem("")) table_widget.item(i, 2).setBackground(green_brush) def set_background_color(self, table_widget, row, col, color): """设置表格背景颜色""" item = table_widget.item(row, col) table_widget.setItem(row, col, item) brush = QColor(color) table_widget.item(row, col).setBackground(brush) def update_table(self, table_widget, port_name): # 更新串口通道表格 row_count = table_widget.rowCount() for i in range(row_count): item = table_widget.item(i, 1) if item and item.text() == port_name: item.setBackground(QColor(0, 255, 0)) # 设置颜色 break def update_table_status(self, table_widget, row, col, status, color): item = table_widget.item(row, col) original_check_state = item.checkState() # 保存原始复选框状态 # 修改文本和背景颜色 item.setText(status) brush = QColor(color) item.setBackground(brush) if col == 0: item.setCheckState(original_check_state) def reset_port_color(self, table_widget, ind): """重置表格颜色""" item = QTableWidgetItem('') table_widget.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() def add_item_ser_channel(self, port_name): self.add_item_channel(self.tableWidgetSerChannel, port_name) def add_item_net_channel(self, port_name): self.add_item_channel(self.tableWidgetNetChannel, port_name) def delete_item_ser_channel(self, port_name): self.delete_item_channel(self.tableWidgetSerChannel, port_name) def delete_item_net_channel(self, port_name): self.delete_item_channel(self.tableWidgetNetChannel, port_name) def find_port_ser_row(self, port_name): return self.find_port_row(self.tableWidgetSerChannel, port_name) def find_port_net_row(self, port_name): return self.find_port_row(self.tableWidgetNetChannel, port_name) def find_selected_ser_ports(self): return self.find_selected_ports(self.tableWidgetSerChannel) def find_selected_net_ports(self): return self.find_selected_ports(self.tableWidgetNetChannel) def find_all_ser_ports(self): return self.find_all_ports(self.tableWidgetSerChannel) def find_all_net_ports(self): return self.find_all_ports(self.tableWidgetNetChannel) def select_ser_channel_all(self): self.select_channel_all(self.tableWidgetSerChannel) def select_net_channel_all(self): self.select_channel_all(self.tableWidgetNetChannel) def select_ser_channel_none(self): self.select_channel_none(self.tableWidgetSerChannel) def select_net_channel_none(self): self.select_channel_none(self.tableWidgetNetChannel) def clear_ser_channel(self): self.clear_channel(self.tableWidgetSerChannel) def clear_net_channel(self): self.clear_channel(self.tableWidgetNetChannel) def select_ser_channel_single(self, channel_name, state): self.set_checkbox_state(self.tableWidgetSerChannel, channel_name, state) def select_net_channel_single(self, channel_name, state): self.set_checkbox_state(self.tableWidgetNetChannel, channel_name, state) def set_background_color_ser_channel(self, row, col, color): self.set_background_color(self.tableWidgetSerChannel, row, col, color) def set_background_color_net_channel(self, row, col, color): self.set_background_color(self.tableWidgetNetChannel, row, col, color) def update_ser_table(self, port_name): self.update_table(self.tableWidgetSerChannel, port_name) def update_net_table(self, port_name): self.update_table(self.tableWidgetNetChannel, port_name) def update_ser_table_status(self, row, col, status, color): self.update_table_status(self.tableWidgetSerChannel, row, col, status, color) def update_net_table_status(self, row, col, status, color): self.update_table_status(self.tableWidgetNetChannel, row, col, status, color) def reset_ser_port_color(self, ind): self.reset_port_color(self.tableWidgetSerChannel, ind) def reset_net_port_color(self, ind): self.reset_port_color(self.tableWidgetNetChannel, ind) """以下控制接收发送状态""" def get_checkBoxHexReceive(self): return self.checkBoxHexReceive.checkState() def set_checkBoxHexReceive(self, state_int): self.checkBoxHexReceive.setCheckState(state_int) def get_checkBoxHexSend(self): return self.checkBoxHexSend.checkState() def set_checkBoxHexSend(self, state_int): self.checkBoxHexSend.setCheckState(state_int) def get_checkBoxAddDate(self): return self.checkBoxAddDate.checkState() def set_checkBoxAddDate(self, state_int): self.checkBoxAddDate.setCheckState(state_int) def get_checkBoxCRLF(self): return self.checkBoxCRLF.checkState() def set_checkBoxCRLF(self, state_int): self.checkBoxCRLF.setCheckState(state_int) def get_checkBoxAddCRC_RTU(self): return self.checkBoxAddCRC.checkState() def set_checkBoxAddCRC_RTU(self, state_int): self.checkBoxAddCRC.setCheckState(state_int) def get_checkBoxAutoSaveLog(self): return self.checkBoxAutoSaveLog.checkState() def set_checkBoxAutoSaveLog(self, state_int): self.checkBoxAutoSaveLog.setCheckState(state_int) def get_checkBoxAutoSaveDB(self): return self.checkBoxAutoSaveDB.checkState() def set_checkBoxAutoSaveDB(self, state_int): self.checkBoxAutoSaveDB.setCheckState(state_int) def get_checkBoxAddCRC(self): return self.checkBoxAddCRC.checkState() def set_checkBoxAddCRC(self, state_int): self.checkBoxAddCRC.setCheckState(state_int) if __name__ == '__main__': import sys app = QApplication(sys.argv) ui = UiMain() ui.show() sys.exit(app.exec_())