397 lines
15 KiB
Python
397 lines
15 KiB
Python
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_())
|