397 lines
15 KiB
Python
Raw Permalink Normal View History

2025-03-14 15:46:15 +08:00
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_())