2025-03-14 15:46:15 +08:00

397 lines
15 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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_())