from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import QSize, Qt from PyQt5.Qt import * from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtWidgets import QHBoxLayout, QAbstractItemView, QTableView, QVBoxLayout, QSplitter, \ QApplication, QGroupBox, QLabel, QGridLayout, QLineEdit, QComboBox, QTextEdit, QCheckBox,QVBoxLayout,QListView, QMainWindow from PyQt5.QtWidgets import QListWidget, QStackedWidget, QFrame from PyQt5.QtWidgets import QListWidgetItem, QSizePolicy from PyQt5.QtWidgets import QWidget, QSpacerItem, QHeaderView from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtWebEngineWidgets import QWebEnginePage from utils.DBModels.ProtocolModel import InfluxMem from utils import Globals from model.HistoryDBModel.HistoryDBManage import HistoryDBManage import datetime import pyecharts.options as opts from pyecharts.charts import Line import numpy as np from Static import static class HistoryTrend(object): def __init__(self, view): self.line = Line(init_opts= opts.InitOpts(width = str(view.size().width() - 20) + 'px', height = str(view.size().height() - 30) + 'px')) self.setOpts() def addXAxis(self, xAxis): self.line.add_xaxis(xaxis_data=xAxis) def addYAxis(self, lineName, yAxis): self.line.add_yaxis( series_name=lineName, y_axis=yAxis, markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ] ), markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average", name="平均值")] ), ) def setOpts(self): self.line.set_global_opts( title_opts=opts.TitleOpts(title="趋势图"), tooltip_opts=opts.TooltipOpts(trigger="axis"), toolbox_opts=opts.ToolboxOpts(is_show=True), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), datazoom_opts=[ opts.DataZoomOpts(xaxis_index=0, range_start=0, range_end=100), ], ) @property def html(self): return self.line.render_embed() class TrendWidgets(QWidget): def __init__(self, parent=None): super(TrendWidgets, self).__init__(parent) # self.setAttribute(Qt.WA_StyledBackground, True) # 移除无效属性 self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") # 变量列表 self.varListWidget = QListWidget() self.varListWidget.setObjectName("varListWidget") self.varListWidget.itemDoubleClicked.connect(self.showVarTrend) self.gridLayout.addWidget(self.varListWidget, 0, 0, 15, 4) # 趋势图WebView self.trendWebView = QWebEngineView() self.trendWebView.setObjectName("trendWebView") self.gridLayout.addWidget(self.trendWebView, 0, 4, 15, 22) self.gridLayout.setSpacing(10) self.gridLayout.setContentsMargins(20, 20, 20, 20) Globals.setValue('HistoryWidget', self) def exchangeProject(self): self.historyDB = Globals.getValue('historyDBManage') self.refreshVarList() def deleteMem(self): pass # 历史mem相关功能已废弃 def itemCheckstate(self): pass # 历史mem相关功能已废弃 @QtCore.pyqtSlot(str) def on_lineEdit_textChanged(self, text): pass # 历史mem相关功能已废弃 def listContext(self, position): pass # 历史mem相关功能已废弃 def delVarRecard(self): pass # 历史mem相关功能已废弃 def getMems(self): pass # 历史mem相关功能已废弃 def refreshList(self, index): pass # 历史mem相关功能已废弃 def createHtml(self, varNames): pass # 历史mem相关功能已废弃 def refreshVarList(self): # 显示进度条 self.varListWidget.clear() varNames = [] try: sql = f'SELECT DISTINCT("varName") FROM "{self.historyDB.table}"' df = self.historyDB.client.query(sql, mode="pandas") import pandas as pd if isinstance(df, pd.DataFrame) and 'varName' in df.columns: varNames = df['varName'].tolist() except Exception as e: print(f"获取变量名失败: {e}") varNames = [] for name in varNames: item = QListWidgetItem(str(name)) self.varListWidget.addItem(item) def showVarTrend(self, item): varName = item.text() # 查询该变量历史数据 data, timeList = self.historyDB.queryVarHistory(varName) if not data or not timeList: self.trendWebView.setHtml('

无历史数据

') return # 构建趋势图 line = Line(init_opts=opts.InitOpts(width='900px', height='500px')) line.add_xaxis(timeList) line.add_yaxis(varName, data) line.set_global_opts( title_opts=opts.TitleOpts(title=f"{varName} 历史趋势"), tooltip_opts=opts.TooltipOpts(trigger="axis"), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), datazoom_opts=[opts.DataZoomOpts(xaxis_index=0, range_start=0, range_end=100)], ) html = line.render_embed() page = QWebEnginePage(self.trendWebView) page.setHtml('\n\n' + html) self.trendWebView.setPage(page) self.trendWebView.reload()