From cea026ee9040a47efcc84e5c53d5f39772e25d30 Mon Sep 17 00:00:00 2001 From: zcwBit Date: Fri, 18 Jul 2025 21:52:08 +0800 Subject: [PATCH] =?UTF-8?q?0718=E6=9B=B4=E6=96=B0=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=8A=E6=96=B9=E6=90=9C=E7=B4=A2=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/Main/Main.py | 3 + UI/Main/MainTop.py | 157 ++++++++++++++++++++++++++++++++-- UI/TrendManage/TrendWidget.py | 13 +++ UI/VarManages/VarTable.py | 19 +++- UI/VarManages/VarWidget.py | 11 +++ 5 files changed, 195 insertions(+), 8 deletions(-) diff --git a/UI/Main/Main.py b/UI/Main/Main.py index 445f32d..1d982f6 100644 --- a/UI/Main/Main.py +++ b/UI/Main/Main.py @@ -158,6 +158,9 @@ class MainWindow(QMainWindow): self.topWidget = MainTop(self) self.topWidget.setObjectName('topWidget') + + # 初始化搜索框状态(在topWidget创建后) + self.topWidget.updateSearchPlaceholder() self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.horizontalLayout = QtWidgets.QHBoxLayout() diff --git a/UI/Main/MainTop.py b/UI/Main/MainTop.py index 1fb1f91..1f6704e 100644 --- a/UI/Main/MainTop.py +++ b/UI/Main/MainTop.py @@ -11,6 +11,7 @@ class MainTop(QtWidgets.QWidget): self.MainWindow = MainWindow self.setupUi() self.setAttribute(Qt.WA_StyledBackground, True) + self.setupSearchListeners() # self.trendWidget = TrendWidgets() def setupUi(self): @@ -71,17 +72,78 @@ class MainTop(QtWidgets.QWidget): self.horizontalLayout.setStretch(4, 5) def searchEditTextChanged(self, text): + # 获取当前活动界面的索引 + currentIndex = self.MainWindow.rightWidget.currentIndex() + + # 检查是否在趋势界面 + if currentIndex == 2: # 趋势界面 + trendWidget = self.MainWindow.rightWidget.widget(2) + if hasattr(trendWidget, 'performSearch'): + trendWidget.performSearch(text) + elif hasattr(trendWidget, 'filterVarList'): + trendWidget.filterVarList(text) + return + + # 获取当前活动的变量表格 + currentVarWidget = self.getCurrentVarTable() + + if currentVarWidget: + # 在变量管理界面,直接搜索当前表格 + self.performVarTableSearch(currentVarWidget, text) + else: + # 使用原有逻辑处理其他界面 + self.performLegacySearch(text) + + def getCurrentVarTable(self): + """获取当前显示的变量表格Widget""" + # 检查当前是否在变量管理界面 + if self.MainWindow.rightWidget.currentIndex() != 1: + return None + + # 获取变量管理TabWidget + varManageTabWidget = self.MainWindow.rightWidget.widget(1) + + # 获取当前活动的Tab + currentTabIndex = varManageTabWidget.currentIndex() + currentTabWidget = varManageTabWidget.widget(currentTabIndex) + + # 检查是否是支持搜索的变量表格(排除Profibus) + if currentTabIndex == 8: # Profibus界面,不支持搜索 + return None + + # 检查是否有变量表格相关属性 + if hasattr(currentTabWidget, 'varView') or hasattr(currentTabWidget, 'model'): + return currentTabWidget + + return None + + def performVarTableSearch(self, varWidget, text): + """对变量表格执行搜索""" + try: + # 优先使用统一的performSearch接口 + if hasattr(varWidget, 'performSearch'): + varWidget.performSearch(text) + + # VarWidgets类型(Modbus相关和其他继承类) + elif hasattr(varWidget, 'proxy') and hasattr(varWidget, 'on_lineEdit_textChanged'): + # 设置搜索列为变量名列(通常是第3列) + if hasattr(varWidget, 'on_comboBox_currentIndexChanged'): + varWidget.on_comboBox_currentIndexChanged(3) + varWidget.on_lineEdit_textChanged(text) + + except Exception as e: + print(f"搜索执行失败: {e}") + + def performLegacySearch(self, text): + """执行原有的搜索逻辑""" index = Globals.getValue('SearchWidget') - # print(index, 'aaaaa') + if index == 0: self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(1) self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) - elif index == 1: - self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(3) - self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) - elif index == 2: - # self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(0) - self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) + elif index == 2: # 趋势界面 + if hasattr(self.MainWindow.rightWidget.widget(index), 'filterVarList'): + self.MainWindow.rightWidget.widget(index).filterVarList(text) elif index == 3: self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(1) self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) @@ -106,4 +168,85 @@ class MainTop(QtWidgets.QWidget): def mouseDoubleClickEvent(self, e): # 双击 self.showMax() + + def setupSearchListeners(self): + """设置搜索相关的事件监听""" + try: + # 监听主界面切换 + self.MainWindow.rightWidget.currentChanged.connect(self.onMainWidgetChanged) + + # 监听变量管理Tab切换 + if hasattr(self.MainWindow, 'varManageTabWidget'): + self.MainWindow.varManageTabWidget.currentChanged.connect(self.onVarTabChanged) + except Exception as e: + print(f"设置搜索监听失败: {e}") + + def onMainWidgetChanged(self, index): + """主界面切换时更新搜索状态""" + self.updateSearchPlaceholder() + self.searchEdit.clear() + + def onVarTabChanged(self, index): + """变量管理Tab切换时更新搜索状态""" + if self.MainWindow.rightWidget.currentIndex() == 1: # 在变量管理界面 + self.updateSearchPlaceholder() + self.searchEdit.clear() + + def updateSearchPlaceholder(self): + """根据当前界面更新搜索框占位符和状态""" + try: + currentIndex = self.MainWindow.rightWidget.currentIndex() + + if currentIndex == 2: + # 趋势界面 + self.searchEdit.setPlaceholderText("搜索历史变量...") + self.searchEdit.setEnabled(True) + + elif currentIndex == 1: + # 变量管理界面 + currentVarWidget = self.getCurrentVarTable() + if currentVarWidget: + # 支持搜索的变量表格 + placeholder = self.getVarWidgetPlaceholder(currentVarWidget) + self.searchEdit.setPlaceholderText(placeholder) + self.searchEdit.setEnabled(True) + else: + # 不支持搜索的Tab(如Profibus) + self.searchEdit.setPlaceholderText("当前界面不支持搜索") + self.searchEdit.setEnabled(False) + + else: + # 其他界面 + self.searchEdit.setPlaceholderText("搜索...") + self.searchEdit.setEnabled(True) + + except Exception as e: + print(f"更新搜索占位符失败: {e}") + self.searchEdit.setPlaceholderText("搜索...") + self.searchEdit.setEnabled(True) + + def getVarWidgetPlaceholder(self, varWidget): + """根据变量Widget类型获取搜索占位符""" + try: + # 获取当前Tab索引来确定类型 + varManageTabWidget = self.MainWindow.rightWidget.widget(1) + currentTabIndex = varManageTabWidget.currentIndex() + + placeholderMap = { + 0: "搜索Modbus TCP主站变量...", + 1: "搜索Modbus TCP从站变量...", + 2: "搜索Modbus RTU主站变量...", + 3: "搜索Modbus RTU从站变量...", + 4: "搜索IO变量...", + 5: "搜索TC/RTD变量...", + 6: "搜索HART读取变量...", + 7: "搜索HART模拟变量...", + 9: "搜索远程通讯变量..." + } + + return placeholderMap.get(currentTabIndex, "搜索变量...") + + except Exception as e: + print(f"获取占位符失败: {e}") + return "搜索变量..." \ No newline at end of file diff --git a/UI/TrendManage/TrendWidget.py b/UI/TrendManage/TrendWidget.py index 97070d4..eb36462 100644 --- a/UI/TrendManage/TrendWidget.py +++ b/UI/TrendManage/TrendWidget.py @@ -692,6 +692,19 @@ class TrendWidgets(QWidget): # 自动触发查询 if idx != 4: self.onTimeRangeQuery() + + def performSearch(self, searchText): + """统一搜索接口,供顶部搜索栏调用""" + try: + self.filterVarList(searchText) + return True + except Exception as e: + print(f"趋势界面搜索失败: {e}") + return False + + def getSearchPlaceholder(self): + """获取搜索占位符文本""" + return "搜索历史变量..." # 使用示例 if __name__ == "__main__": diff --git a/UI/VarManages/VarTable.py b/UI/VarManages/VarTable.py index 2ca68a4..a0900bd 100644 --- a/UI/VarManages/VarTable.py +++ b/UI/VarManages/VarTable.py @@ -190,7 +190,12 @@ class RpcVarTableView(QTableView): self.setSelectionBehavior(QAbstractItemView.SelectRows) self.setItemDelegateForColumn(7, RpcVarButtonDelegate(self)) self.model = RpcVarModel(['客户端', '变量名', '类型', '下限', '上限', '当前值', '操作'], self) - self.setModel(self.model) + + # 添加代理模型用于搜索过滤 + self.proxy = QtCore.QSortFilterProxyModel(self) + self.proxy.setSourceModel(self.model) + self.setModel(self.proxy) + self.header = QHeaderView(Qt.Horizontal, self) self.header.setStretchLastSection(True) self.setHorizontalHeader(self.header) @@ -199,3 +204,15 @@ class RpcVarTableView(QTableView): def setupColumnWidths(self): self.header.setSectionResizeMode(QHeaderView.Stretch) + + def performSearch(self, searchText): + """RPC变量表格搜索接口""" + try: + # 设置搜索列为变量名列(索引1) + self.proxy.setFilterKeyColumn(1) + search = QtCore.QRegExp(searchText, QtCore.Qt.CaseInsensitive, QtCore.QRegExp.RegExp) + self.proxy.setFilterRegExp(search) + return True + except Exception as e: + print(f"RPC变量搜索失败: {e}") + return False diff --git a/UI/VarManages/VarWidget.py b/UI/VarManages/VarWidget.py index 18bc1fa..757e242 100644 --- a/UI/VarManages/VarWidget.py +++ b/UI/VarManages/VarWidget.py @@ -339,6 +339,17 @@ class VarWidgets(QtWidgets.QWidget): self._isPopenOpen = False self.startProtocolBtn.setText('开始通讯') self.startProtocolBtn.setIcon(QIcon('./Static/startProtocol.png')) + + def performSearch(self, searchText): + """统一搜索接口""" + try: + # 设置搜索列为变量名列(通常是第3列) + self.on_comboBox_currentIndexChanged(3) + self.on_lineEdit_textChanged(searchText) + return True + except Exception as e: + print(f"搜索执行失败: {e}") + return False class HartWidgets(VarWidgets):