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.memLsit = [] # 所有mem列表 self.setAttribute(Qt.WA_StyledBackground, True) self.gridLayout = QtWidgets.QGridLayout(self) self.gridLayout.setObjectName("gridLayout") self.timeBox = QtWidgets.QComboBox() self.timeBox.setObjectName("timeBox") self.timeBox.activated.connect(self.refreshList) self.listview = QListView() self.listview.setObjectName("trendListView") self.model = QStandardItemModel() self.listview.setContextMenuPolicy(Qt.CustomContextMenu) self.listview.customContextMenuRequested.connect(self.listContext) self.model.itemChanged.connect(self.itemCheckstate) # self.widget = QtWidgets.QWidget(self) self.trendWebView = QWebEngineView() self.trendWebView.setObjectName("trendWebView") self.proxy = QtCore.QSortFilterProxyModel(self) # self.listview.proxy = self.proxy self.proxy.setSourceModel(self.model) self.listview.setModel(self.proxy) self.delBtn = QtWidgets.QPushButton(QIcon(':/static/delete.png'), '删除记录', self) self.delBtn.setObjectName('delBtn') self.delBtn.setIconSize(QSize(22, 22)) self.delBtn.clicked.connect(self.deleteMem) self.gridLayout.addWidget(self.timeBox, 0, 0, 1, 3) self.gridLayout.addWidget(self.delBtn, 0, 3, 1, 1) self.gridLayout.addWidget(self.listview, 1, 0, 14, 4) 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 deleteMem(self): if not self.memLsit: return self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()] self.historyDB.deleteMem() InfluxMem.deleteMem(self.historyDB.mem) self.getMems() self.exchangeProject() self.model.clear() def itemCheckstate(self): # 勾选变量复选框事件 allItems = self.model.findItems('*', Qt.MatchWildcard) itemCheckedList = [] for item in allItems: if item.checkState() == Qt.Checked: itemCheckedList.append(item.text()) if not itemCheckedList: return self.lineTrend = HistoryTrend(self.trendWebView) self.createHtml(itemCheckedList) @QtCore.pyqtSlot(str) def on_lineEdit_textChanged(self, text): # 搜索框文字变化函数 search = QtCore.QRegExp(text, QtCore.Qt.CaseInsensitive, QtCore.QRegExp.RegExp ) self.proxy.setFilterKeyColumn(0) self.proxy.setFilterRegExp(search) def listContext(self, position): # 点击右键删除事件 menu = QtWidgets.QMenu() listDel = QtWidgets.QAction('删除') listDel.triggered.connect(self.delVarRecard) menu.addAction(listDel) menu.exec_(self.listview.mapToGlobal(position)) def delVarRecard(self): # 删除变量记录 # count = self.listWidget.count() # cb_list = [self.listWidget.itemWidget(self.listWidget.item(i)) # for i in range(count)] index = self.listview.currentIndex() varName = self.model.item(index.row()).text() self.model.removeRow(index.row()) # self.memName = self.timeBox.currentText() self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()] self.historyDB.deleteFun(str(varName)) def exchangeProject(self): self.timeBox.clear() self.memLsit = [] self.getMems() self.refreshList(0) self.trendWebView.setHtml('') def getMems(self): # 获取所有的趋势表 mems = InfluxMem.get_all() self.proName = Globals.getValue('currentPro') self.timeBox.clear() if mems is 'Error': return for x in mems: time = datetime.datetime.fromtimestamp(float(x.mem)).strftime("%Y-%m-%d %H:%M:%S") if self.timeBox.findText(time) == -1: self.timeBox.addItem(time) self.memLsit.append(x.mem) self.historyDB = HistoryDBManage(bucket = self.proName, isCelery = False) # self.refreshList(self.timeBox.currentIndex()) def refreshList(self, index): # 更新变量列表 self.model.clear() if self.memLsit == []: return self.historyDB.mem = self.memLsit[index] # self.historyDB.startTime = int(float(self.memLsit[index])) # print(self.memLsit[index]) tagSet = self.historyDB.queryVarName() # if not tagSet: # QMessageBox.information(self, '提示', '当前工程历史趋势已损坏') # return for tag in tagSet: item = QStandardItem(str(tag)) item.setCheckable(True) self.model.appendRow(item) self.lineTrend = HistoryTrend(self.trendWebView) def createHtml(self, varNames): # 创建趋势图网页 self.historyDB.mem = self.memLsit[self.timeBox.currentIndex()] xAxisList = [] allData = [] for var in varNames: varData, xAxis = self.historyDB.queryFun(str(var)) xAxisList.append(xAxis) allData.append(varData) xAxis = max(xAxisList, key=len) self.lineTrend.addXAxis(xAxis) [self.lineTrend.addYAxis(varNames[index], varData) for index, varData in enumerate(allData)] # self.trendWebView.reload() page = QWebEnginePage(self.trendWebView) page.setHtml('\n\n' + self.lineTrend.html) self.trendWebView.setPage(page) self.trendWebView.reload()