[ref]同步711 711更新
This commit is contained in:
parent
499b61b93e
commit
01f6a1ca4b
@ -1,4 +1,4 @@
|
||||
#include "CCurveLegendModel.h"
|
||||
#include "CCurveLegendModel.h"
|
||||
#include "CTrendGraph.h"
|
||||
#include <QTableWidgetItem>
|
||||
#include <QDoubleSpinBox>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CCURVELEGENDMODEL_H
|
||||
#ifndef CCURVELEGENDMODEL_H
|
||||
#define CCURVELEGENDMODEL_H
|
||||
|
||||
#include <QLabel>
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
#include "CCurveLegendView.h"
|
||||
#include "CCurveLegendView.h"
|
||||
#include "CCurveLegendModel.h"
|
||||
#include <QContextMenuEvent>
|
||||
#include <QMenu>
|
||||
#include <QtMath>
|
||||
#include <QHeaderView>
|
||||
|
||||
CCurveLegendView::CCurveLegendView(QWidget *parent)
|
||||
: CTableView(parent)
|
||||
@ -9,6 +11,43 @@ CCurveLegendView::CCurveLegendView(QWidget *parent)
|
||||
|
||||
}
|
||||
|
||||
void CCurveLegendView::adjustHeaderWidth()
|
||||
{
|
||||
QHeaderView *header = horizontalHeader();
|
||||
int sectionCount = header->count();
|
||||
if (sectionCount == 0 || !model()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QFontMetrics fontMetrics(header->font());
|
||||
const int maxWidthThreshold = 200;
|
||||
const int baseHeight = 30;
|
||||
int maxHeightMultiplier = 1;
|
||||
|
||||
for (int section = 0; section < sectionCount; ++section) {
|
||||
QString headerText = model()->headerData(section, Qt::Horizontal).toString();
|
||||
if (headerText.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int textWidth = fontMetrics.width(headerText) + 20; // 额外空间
|
||||
int heightMultiplier = 1;
|
||||
|
||||
// 调整宽度和计算换行高度
|
||||
if (textWidth > maxWidthThreshold) {
|
||||
header->resizeSection(section, maxWidthThreshold);
|
||||
heightMultiplier = qCeil(static_cast<qreal>(textWidth) / maxWidthThreshold);
|
||||
} else {
|
||||
header->resizeSection(section, textWidth);
|
||||
}
|
||||
|
||||
maxHeightMultiplier = qMax(maxHeightMultiplier, heightMultiplier);
|
||||
}
|
||||
|
||||
header->setFixedHeight(maxHeightMultiplier * baseHeight);
|
||||
}
|
||||
|
||||
|
||||
void CCurveLegendView::contextMenuEvent(QContextMenuEvent *event)
|
||||
{
|
||||
CCurveLegendModel * pModel = dynamic_cast<CCurveLegendModel *>(model());
|
||||
@ -27,3 +66,9 @@ void CCurveLegendView::contextMenuEvent(QContextMenuEvent *event)
|
||||
return;
|
||||
}
|
||||
|
||||
void CCurveLegendView::showEvent(QShowEvent *event)
|
||||
{
|
||||
QTableView::showEvent(event);
|
||||
adjustHeaderWidth();
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CCURVELEGENDVIEW_H
|
||||
#ifndef CCURVELEGENDVIEW_H
|
||||
#define CCURVELEGENDVIEW_H
|
||||
|
||||
#include "CTableView.h"
|
||||
@ -9,8 +9,11 @@ class CCurveLegendView : public CTableView
|
||||
public:
|
||||
CCurveLegendView(QWidget *parent = Q_NULLPTR);
|
||||
|
||||
void adjustHeaderWidth();
|
||||
|
||||
protected:
|
||||
void contextMenuEvent(QContextMenuEvent *event);
|
||||
void showEvent(QShowEvent *event) override ;
|
||||
};
|
||||
|
||||
#endif // CCURVELEGENDVIEW_H
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
#include "CHisDataManage.h"
|
||||
#include "CHisDataManage.h"
|
||||
#include "db_his_query_api/DbHisQueryApi.h"
|
||||
#include "sample_server_api/SampleDefine.h"
|
||||
#include "CTrendInfoManage.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
using namespace iot_dbms;
|
||||
|
||||
@ -10,9 +9,7 @@ int CHisDataManage::m_nProcessNumber = 0;
|
||||
CHisDataManage::CHisDataManage(QObject *parent)
|
||||
: QObject(parent),
|
||||
m_TsdbExcuting(false),
|
||||
m_bHasPendingCommandCurve(false),
|
||||
m_bHasPendingCommandEvent(false),
|
||||
m_bHasPendingCommandCompute(false),
|
||||
m_bHasPending(false),
|
||||
m_tsdbConnPtr((CTsdbConn*)nullptr)
|
||||
{
|
||||
initTsdbApi();
|
||||
@ -28,26 +25,15 @@ CHisDataManage::~CHisDataManage()
|
||||
releaseTsdbApi();
|
||||
}
|
||||
|
||||
foreach (TsdbCommand cmd, m_listCommandCurve)
|
||||
foreach (QList<TsdbCommand> cmdList, m_listCommand) {
|
||||
foreach (TsdbCommand cmd, cmdList)
|
||||
{
|
||||
cmd.pVecMpKey->clear();
|
||||
delete cmd.pVecMpKey;
|
||||
}
|
||||
m_listCommandCurve.clear();
|
||||
|
||||
foreach (TsdbCommand cmd, m_listCommandEvent)
|
||||
{
|
||||
cmd.pVecMpKey->clear();
|
||||
delete cmd.pVecMpKey;
|
||||
cmdList.clear();
|
||||
}
|
||||
m_listCommandEvent.clear();
|
||||
|
||||
foreach (TsdbCommand cmd, m_listCommandCompute)
|
||||
{
|
||||
cmd.pVecMpKey->clear();
|
||||
delete cmd.pVecMpKey;
|
||||
}
|
||||
m_listCommandCompute.clear();
|
||||
m_listCommand.clear();
|
||||
}
|
||||
|
||||
bool CHisDataManage::isTsdbExuting()
|
||||
@ -56,41 +42,47 @@ bool CHisDataManage::isTsdbExuting()
|
||||
return m_TsdbExcuting;
|
||||
}
|
||||
|
||||
void CHisDataManage::postTsdbCommandQueue(E_His_Type type, std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, int nGroupBySec, std::vector<EnComputeMethod> vecCM)
|
||||
void CHisDataManage::postTsdbCommandQueue(const QList<TsdbCommand> &cmd)
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
TsdbCommand cmd;
|
||||
cmd.type = type;
|
||||
cmd.pVecMpKey = vecMpKey;
|
||||
cmd.lower = lower;
|
||||
cmd.upper = upper;
|
||||
cmd.nGroupBySec = nGroupBySec;
|
||||
cmd.vecMethod = vecCM;
|
||||
|
||||
switch(type)
|
||||
m_bHasPending = true;
|
||||
m_listCommand.push_back(cmd);
|
||||
}
|
||||
|
||||
void CHisDataManage::queryHistoryRecord(const QList<TsdbCommand> &cmdList)
|
||||
{
|
||||
{
|
||||
case E_ORIGINAL:
|
||||
case E_POLYMERIC:
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = true;
|
||||
}
|
||||
|
||||
emit sigHisSearch(true);
|
||||
foreach (TsdbCommand cmd, cmdList) {
|
||||
if(E_ORIGINAL == cmd.type)
|
||||
{
|
||||
m_bHasPendingCommandCurve = true;
|
||||
m_listCommandCurve.push_back(cmd);
|
||||
break;
|
||||
queryHistoryOriginalData(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.dataType);
|
||||
}
|
||||
case E_EVENTPOINT:
|
||||
else if(E_POLYMERIC == cmd.type)
|
||||
{
|
||||
m_bHasPendingCommandEvent = true;
|
||||
m_listCommandEvent.push_back(cmd);
|
||||
break;
|
||||
queryHistoryPolymericData(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.nGroupBySec, cmd.vecMethod.front(), cmd.dataType);
|
||||
}
|
||||
case E_COMPUTER:
|
||||
else if(E_EVENTPOINT == cmd.type)
|
||||
{
|
||||
m_bHasPendingCommandCompute = true;
|
||||
m_listCommandCompute.push_back(cmd);
|
||||
break;
|
||||
queryHistoryEvents(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.vecMethod.front(), cmd.nGroupBySec);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
else if(E_COMPUTER == cmd.type)
|
||||
{
|
||||
queryHistoryComputeData(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.vecMethod, cmd.dataType);
|
||||
}
|
||||
}
|
||||
emit sigHisSearch(false);
|
||||
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = false;
|
||||
}
|
||||
checkTsdbCommandQueue();
|
||||
}
|
||||
|
||||
void CHisDataManage::release()
|
||||
@ -134,45 +126,24 @@ bool CHisDataManage::getValidTsdbConnPtr(iot_dbms::CTsdbConnPtr &ptr)
|
||||
|
||||
void CHisDataManage::checkTsdbCommandQueue()
|
||||
{
|
||||
checkTsdbCommandQueue(m_bHasPendingCommandCurve, m_listCommandCurve);
|
||||
checkTsdbCommandQueue(m_bHasPendingCommandEvent, m_listCommandEvent);
|
||||
checkTsdbCommandQueue(m_bHasPendingCommandCompute, m_listCommandCompute);
|
||||
}
|
||||
|
||||
void CHisDataManage::checkTsdbCommandQueue(bool &bHasPend, QList<TsdbCommand> &listCommand)
|
||||
{
|
||||
if(bHasPend)
|
||||
if(m_bHasPending)
|
||||
{
|
||||
bHasPend = false;
|
||||
TsdbCommand cmd;
|
||||
m_bHasPending = false;
|
||||
QList<TsdbCommand> cmdList;
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
if(!listCommand.isEmpty())
|
||||
if(!m_listCommand.isEmpty())
|
||||
{
|
||||
cmd = listCommand.takeLast();
|
||||
cmdList = m_listCommand.takeLast();
|
||||
}
|
||||
}
|
||||
if(E_ORIGINAL == cmd.type)
|
||||
{
|
||||
queryHistoryOriginalData(cmd.pVecMpKey, cmd.lower, cmd.upper);
|
||||
}
|
||||
else if(E_POLYMERIC == cmd.type)
|
||||
{
|
||||
queryHistoryPolymericData(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.nGroupBySec, cmd.vecMethod.front());
|
||||
}
|
||||
else if(E_EVENTPOINT == cmd.type)
|
||||
{
|
||||
queryHistoryEvents(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.vecMethod.front(), cmd.nGroupBySec);
|
||||
}
|
||||
else if(E_COMPUTER == cmd.type)
|
||||
{
|
||||
queryHistoryComputeData(cmd.pVecMpKey, cmd.lower, cmd.upper, cmd.vecMethod);
|
||||
}
|
||||
queryHistoryRecord(cmdList);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (TsdbCommand cmd, listCommand)
|
||||
foreach (QList<TsdbCommand> cmdList, m_listCommand)
|
||||
{
|
||||
foreach (TsdbCommand cmd, cmdList) {
|
||||
std::vector<SMeasPointKey>::iterator it = cmd.pVecMpKey->begin();
|
||||
while(it != cmd.pVecMpKey->end())
|
||||
{
|
||||
@ -182,17 +153,14 @@ void CHisDataManage::checkTsdbCommandQueue(bool &bHasPend, QList<TsdbCommand> &l
|
||||
cmd.pVecMpKey->clear();
|
||||
delete cmd.pVecMpKey;
|
||||
}
|
||||
listCommand.clear();
|
||||
cmdList.clear();
|
||||
}
|
||||
m_listCommand.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void CHisDataManage::queryHistoryOriginalData(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, E_Data_Type type)
|
||||
{
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = true;
|
||||
}
|
||||
|
||||
double nIntervalSecs = SAMPLE_CYC_MIN * 60 * 1000;
|
||||
std::vector<std::vector<SVarHisSamplePoint> *> *vecResult = new std::vector<std::vector<SVarHisSamplePoint> *>();
|
||||
|
||||
@ -203,13 +171,11 @@ void CHisDataManage::queryHistoryOriginalData(std::vector<SMeasPointKey> *vecMpK
|
||||
{
|
||||
vecResult->push_back(new std::vector<SVarHisSamplePoint>());
|
||||
}
|
||||
emit sigHisSearch(true);
|
||||
if(!getHisSamplePoint(*tsdbConnPtr, 10000, *vecMpKey, lower - nIntervalSecs, upper + nIntervalSecs,
|
||||
NULL, NULL, CM_NULL, 0, FM_NULL_METHOD, *vecResult))
|
||||
{
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryOriginalData: 查询超时!");
|
||||
}
|
||||
emit sigHisSearch(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -217,21 +183,10 @@ void CHisDataManage::queryHistoryOriginalData(std::vector<SMeasPointKey> *vecMpK
|
||||
}
|
||||
|
||||
emit sigupdateHisOriginalData(vecMpKey, vecResult, type);
|
||||
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = false;
|
||||
}
|
||||
checkTsdbCommandQueue();
|
||||
}
|
||||
|
||||
void CHisDataManage::queryHistoryPolymericData(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, int nGroupBySec, const EnComputeMethod &enCm)
|
||||
void CHisDataManage::queryHistoryPolymericData(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, int nGroupBySec, const EnComputeMethod &enCm, E_Data_Type type)
|
||||
{
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = true;
|
||||
}
|
||||
|
||||
double nIntervalSecs = SAMPLE_CYC_MIN * 60 * 1000;
|
||||
std::vector<std::vector<SVarHisSamplePoint> *> *vecResult = new std::vector<std::vector<SVarHisSamplePoint> *>();
|
||||
|
||||
@ -242,35 +197,22 @@ void CHisDataManage::queryHistoryPolymericData(std::vector<SMeasPointKey> *vecMp
|
||||
{
|
||||
vecResult->push_back(new std::vector<SVarHisSamplePoint>());
|
||||
}
|
||||
emit sigHisSearch(true);
|
||||
if(!getHisSamplePoint(*tsdbConnPtr, 10000, *vecMpKey, lower - nIntervalSecs, upper + nIntervalSecs,
|
||||
NULL, NULL, enCm, nGroupBySec * 1000, FM_NULL_METHOD, *vecResult))
|
||||
{
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryPolymericData: 查询超时!");
|
||||
}
|
||||
emit sigHisSearch(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryPolymericData: 未获取到有效的TSDB连接!");
|
||||
}
|
||||
|
||||
emit sigHistoryPolymericData(vecMpKey, vecResult, nGroupBySec);
|
||||
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = false;
|
||||
}
|
||||
checkTsdbCommandQueue();
|
||||
emit sigHistoryPolymericData(vecMpKey, vecResult, nGroupBySec, type);
|
||||
}
|
||||
|
||||
void CHisDataManage::queryHistoryComputeData(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, const std::vector<EnComputeMethod> &vecCM)
|
||||
void CHisDataManage::queryHistoryComputeData(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, const std::vector<EnComputeMethod> &vecCM, E_Data_Type type)
|
||||
{
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = true;
|
||||
}
|
||||
|
||||
std::vector<std::pair<iot_dbms::EnComputeMethod, std::vector<std::vector<iot_dbms::SVarHisValue> *> *> > cmResult;
|
||||
|
||||
iot_dbms::CTsdbConnPtr tsdbConnPtr;
|
||||
@ -283,7 +225,6 @@ void CHisDataManage::queryHistoryComputeData(std::vector<SMeasPointKey> *vecMpKe
|
||||
{
|
||||
vecResult->push_back(new std::vector<SVarHisValue>());
|
||||
}
|
||||
emit sigHisSearch(true);
|
||||
if(!getHisValue(*tsdbConnPtr, 10000, *vecMpKey, lower, upper,
|
||||
NULL, NULL, NULL, NULL, NULL, vecCM[nCmIndex], 0, FM_NULL_METHOD, *vecResult))
|
||||
{
|
||||
@ -293,7 +234,6 @@ void CHisDataManage::queryHistoryComputeData(std::vector<SMeasPointKey> *vecMpKe
|
||||
tmp.first = vecCM[nCmIndex];
|
||||
tmp.second = vecResult;
|
||||
cmResult.push_back(tmp);
|
||||
emit sigHisSearch(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -301,22 +241,11 @@ void CHisDataManage::queryHistoryComputeData(std::vector<SMeasPointKey> *vecMpKe
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryComputeData: 未获取到有效的TSDB连接!");
|
||||
}
|
||||
|
||||
emit sigHistoryComputeData(vecMpKey, cmResult);
|
||||
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = false;
|
||||
}
|
||||
checkTsdbCommandQueue();
|
||||
emit sigHistoryComputeData(vecMpKey, cmResult, type);
|
||||
}
|
||||
|
||||
void CHisDataManage::queryHistoryEvents(std::vector<SMeasPointKey> *vecMpKey, double lower, double upper, const EnComputeMethod &enCM, int nGroupBySec)
|
||||
{
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = true;
|
||||
}
|
||||
|
||||
std::vector<std::vector<SHisEventPoint> *> *vecResult = new std::vector<std::vector<SHisEventPoint> *>();
|
||||
|
||||
iot_dbms::CTsdbConnPtr tsdbConnPtr;
|
||||
@ -326,22 +255,14 @@ void CHisDataManage::queryHistoryEvents(std::vector<SMeasPointKey> *vecMpKey, do
|
||||
{
|
||||
vecResult->push_back(new std::vector<SHisEventPoint>());
|
||||
}
|
||||
emit sigHisSearch(true);
|
||||
if(!getHisEventPoint(*tsdbConnPtr, 10000, *vecMpKey, lower, upper, enCM, nGroupBySec * 1000, *vecResult))
|
||||
{
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryPolymericData: 查询超时!Lower: %f, Upper: %f, GroupByMs: %d", lower, upper, nGroupBySec);
|
||||
}
|
||||
emit sigHisSearch(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGINFO("TrendCurve CHisDataManage::queryHistoryPolymericData: 未获取到有效的TSDB连接!");
|
||||
}
|
||||
emit sigHistoryEvent(vecMpKey, vecResult);
|
||||
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_TsdbExcuting = false;
|
||||
}
|
||||
checkTsdbCommandQueue();
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CHISDATAMANAGE_H
|
||||
#ifndef CHISDATAMANAGE_H
|
||||
#define CHISDATAMANAGE_H
|
||||
|
||||
#include <QMutex>
|
||||
@ -10,8 +10,8 @@
|
||||
|
||||
enum E_Data_Type
|
||||
{
|
||||
E_REALTIME,
|
||||
E_HISTORY
|
||||
E_HISTORY,
|
||||
E_PRECURVE,
|
||||
};
|
||||
|
||||
enum E_His_Type
|
||||
@ -41,6 +41,7 @@ struct TsdbCommand
|
||||
vecMethod = std::vector<iot_dbms::EnComputeMethod>{iot_dbms::CM_NULL};
|
||||
}
|
||||
E_His_Type type;
|
||||
E_Data_Type dataType;
|
||||
std::vector<iot_dbms::SMeasPointKey> * pVecMpKey;
|
||||
double lower;
|
||||
double upper;
|
||||
@ -64,10 +65,12 @@ signals:
|
||||
|
||||
void sigHistoryPolymericData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::vector<iot_dbms::SVarHisSamplePoint> *> *vecResult,
|
||||
int nGroupBySec);
|
||||
int nGroupBySec,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void sigHistoryComputeData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::pair<iot_dbms::EnComputeMethod, std::vector<std::vector<iot_dbms::SVarHisValue> *> *> > cmResult);
|
||||
std::vector<std::pair<iot_dbms::EnComputeMethod, std::vector<std::vector<iot_dbms::SVarHisValue> *> *> > cmResult,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void sigHistoryEvent(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::vector<iot_dbms::SHisEventPoint> *> *vecResult);
|
||||
@ -77,11 +80,11 @@ signals:
|
||||
public slots:
|
||||
void release();
|
||||
|
||||
void postTsdbCommandQueue(E_His_Type type, std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
int nGroupBySec = -1,
|
||||
std::vector<iot_dbms::EnComputeMethod> vecCM = std::vector<iot_dbms::EnComputeMethod>{iot_dbms::CM_NULL});
|
||||
void postTsdbCommandQueue(const QList<TsdbCommand> &cmd);
|
||||
|
||||
void queryHistoryRecord(const QList<TsdbCommand> &cmdList);
|
||||
|
||||
private:
|
||||
void queryHistoryOriginalData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
@ -89,11 +92,13 @@ public slots:
|
||||
void queryHistoryPolymericData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
int nGroupBySec,
|
||||
const iot_dbms::EnComputeMethod &enCm);
|
||||
const iot_dbms::EnComputeMethod &enCm,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void queryHistoryComputeData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
const std::vector<iot_dbms::EnComputeMethod> &vecCM);
|
||||
const std::vector<iot_dbms::EnComputeMethod> &vecCM,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void queryHistoryEvents(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
@ -103,18 +108,12 @@ public slots:
|
||||
protected:
|
||||
bool getValidTsdbConnPtr(iot_dbms::CTsdbConnPtr &ptr);
|
||||
void checkTsdbCommandQueue();
|
||||
void checkTsdbCommandQueue(bool &bHasPend, QList<TsdbCommand> &listCommand);
|
||||
|
||||
private:
|
||||
bool m_TsdbExcuting;
|
||||
bool m_bHasPendingCommandCurve;
|
||||
bool m_bHasPendingCommandEvent;
|
||||
bool m_bHasPendingCommandCompute;
|
||||
bool m_bHasPending;
|
||||
iot_dbms::CTsdbConnPtr m_tsdbConnPtr;
|
||||
|
||||
QList<TsdbCommand> m_listCommandCurve;
|
||||
QList<TsdbCommand> m_listCommandEvent;
|
||||
QList<TsdbCommand> m_listCommandCompute;
|
||||
QList<QList<TsdbCommand>> m_listCommand;
|
||||
QMutex m_mutex;
|
||||
static int m_nProcessNumber;
|
||||
};
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CHisEventManage.h"
|
||||
#include "CHisEventManage.h"
|
||||
#include "service/alarm_server_api/AlarmCommonDef.h"
|
||||
#include <QDebug>
|
||||
#include "pub_logger_api/logger.h"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CHISEVENTMANAGE_H
|
||||
#ifndef CHISEVENTMANAGE_H
|
||||
#define CHISEVENTMANAGE_H
|
||||
|
||||
#include "dbms/db_api_ex/CDbApi.h"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
#ifndef CPLOTWIDGET_H
|
||||
#ifndef CPLOTWIDGET_H
|
||||
#define CPLOTWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
@ -85,10 +85,14 @@ public:
|
||||
|
||||
void setClearVisible(bool visible);
|
||||
|
||||
void setEnableAddNanFlag(bool bEnable);
|
||||
|
||||
void setAdaptVisible(bool visible);
|
||||
|
||||
void setAlarmPointVisible(bool visible);
|
||||
|
||||
void setPreCurveVisible(bool visible);
|
||||
|
||||
void insertCurve(Curve curve);
|
||||
|
||||
void clear(bool clearTitle = false);
|
||||
@ -115,6 +119,10 @@ public:
|
||||
QColor plotTickPen();
|
||||
void setPlotTickPen(const QColor &color);
|
||||
|
||||
//用于重新设置自定义界面中的周期间隔
|
||||
void clearCustomInterval();
|
||||
void addCustomInterval(const QString &desc,const int &sec);
|
||||
|
||||
signals:
|
||||
void clearCurve();
|
||||
void queryHisEvent(const QString &tag, const int &type, const qint64 &time);
|
||||
@ -122,22 +130,7 @@ signals:
|
||||
void updateTagCheckState(const QString &tag, const bool &outOfRange);
|
||||
void releaseHisDataThread();
|
||||
void releaseHisEventThread();
|
||||
|
||||
void sigQueryHistoryOriginalData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void sigQueryHistoryPolymericData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper, int nGroupByMinute, iot_dbms::EnComputeMethod method);
|
||||
|
||||
void sigQueryHistoryComputeData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
std::vector<iot_dbms::EnComputeMethod> method);
|
||||
|
||||
void sigQueryHistoryEvent(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
double lower, double upper,
|
||||
iot_dbms::EnComputeMethod enCM,
|
||||
int nGroupByMinute);
|
||||
void sigQueryHistoryRecord(const QList<TsdbCommand> &cmdList);
|
||||
void sigAddCollect(int x, int y);
|
||||
void sigHideCollect();
|
||||
|
||||
@ -165,13 +158,14 @@ private slots:
|
||||
|
||||
void updateTrendShowMode(int nIndex, bool updateXAxisRange = true);
|
||||
|
||||
void updateComputeValue(double lower, double upper, std::vector<iot_dbms::EnComputeMethod> vecMethod);
|
||||
TsdbCommand getHisCurveCmd(double lower, double upper, int nGroupBy, E_Data_Type type);
|
||||
TsdbCommand getComputeCmd(double lower, double upper, std::vector<iot_dbms::EnComputeMethod> vecMethod, E_Data_Type type);
|
||||
|
||||
void updateCurves();
|
||||
|
||||
void updateRealTimeCurveRecord();
|
||||
|
||||
void updateHistoryCurveRecord(double lower, double upper);
|
||||
void updateHistoryCurveRecord();
|
||||
|
||||
void updateHisOriginalData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::vector<iot_dbms::SVarHisSamplePoint> *> *vecResult,
|
||||
@ -179,23 +173,28 @@ private slots:
|
||||
|
||||
void updateHisPolymericData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::vector<iot_dbms::SVarHisSamplePoint> *> *vecResult,
|
||||
int nGroupBySec);
|
||||
int nGroupBySec,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void updateHisComputeData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::pair<iot_dbms::EnComputeMethod, std::vector<std::vector<iot_dbms::SVarHisValue> *> *> > cmResult);
|
||||
std::vector<std::pair<iot_dbms::EnComputeMethod, std::vector<std::vector<iot_dbms::SVarHisValue> *> *> > cmResult,
|
||||
E_Data_Type type = E_HISTORY);
|
||||
|
||||
void updateHistoryGraph(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector< QSharedPointer<QCPGraphDataContainer> > &vecContainer,
|
||||
std::vector< QSharedPointer<Range> > &vecRange);
|
||||
std::vector< QSharedPointer<Range> > &vecRange,
|
||||
E_Data_Type type);
|
||||
|
||||
void updateHistoryData(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector< QSharedPointer<QCPGraphDataContainer> > &vecContainer,
|
||||
std::vector< QSharedPointer<Range> > &vecRange);
|
||||
std::vector< QSharedPointer<Range> > &vecRange,
|
||||
E_Data_Type type);
|
||||
|
||||
void updateCurveHisData(double lower, double upper,
|
||||
QCPGraph * graph, int index,
|
||||
QSharedPointer<QCPGraphDataContainer> container,
|
||||
QSharedPointer<Range> range);
|
||||
QSharedPointer<Range> range,
|
||||
E_Data_Type type);
|
||||
|
||||
void updatePhaseTracer(std::vector<iot_dbms::SMeasPointKey> *vecMpKey,
|
||||
std::vector<std::vector<iot_dbms::SHisEventPoint> *> *vecResult);
|
||||
@ -204,6 +203,7 @@ private slots:
|
||||
void updateAxisFormat(bool updateXAxisRange);
|
||||
QPair<double, double> getFatureDataTime(E_Trend_Type type, QDateTime curTime = QDateTime());
|
||||
void updateAdaptState(bool isAdapt);
|
||||
void updatePreCurveState(bool isPreCurve);
|
||||
void addCollect();
|
||||
void slotPrint();
|
||||
void slotExport();
|
||||
@ -263,6 +263,7 @@ private:
|
||||
std::vector< QSharedPointer<Range> > &vecRange,
|
||||
std::vector< QSharedPointer<QCPGraphDataContainer> > &vecContainer,
|
||||
double lower, double upper,
|
||||
E_Data_Type type,
|
||||
bool isAddVirtualPoint = false,
|
||||
int nGroupBySec = 0);
|
||||
|
||||
@ -272,7 +273,7 @@ private:
|
||||
template<typename _Tp>
|
||||
bool checkStatus(const iot_dbms::SVarHisSamplePoint &var, const int &nInvalid);
|
||||
|
||||
void setCurveStatisData(const QString &tag, iot_dbms::EnComputeMethod method, bool reset, const double &value = 0, const double &time = 0);
|
||||
void setCurveStatisData(const QString &tag, const int &curType, iot_dbms::EnComputeMethod method, bool reset, const double &value = 0, const double &time = 0);
|
||||
|
||||
bool isMutation(const double &preValue, const double &curValue);
|
||||
|
||||
@ -289,11 +290,15 @@ private:
|
||||
void resetCurveData(const QMap<QString, QVector<QCPGraphData>>& dataMap, const QStringList& headerList, bool ascs = true);
|
||||
void enableSearch(bool enable);
|
||||
|
||||
void afterModeSwitch();
|
||||
QPair<double, double> getOffsetRange(const double &lower, const double &upper, int direction);
|
||||
double getOffsetTime(const double &time);
|
||||
private:
|
||||
Ui::CPlotWidget *ui;
|
||||
E_Trend_Type m_type;
|
||||
E_Show_Type m_showType;
|
||||
bool m_bHisAdaption;
|
||||
bool m_bShowPreCurve;
|
||||
QButtonGroup * m_TrendTypeButton;
|
||||
CCurveLegendModel * m_pLengedModel;
|
||||
CTableDataModel * m_pTableDataModel;
|
||||
@ -331,6 +336,10 @@ private:
|
||||
bool m_isTooltip;
|
||||
bool m_isAdaptShow;
|
||||
bool m_isAlarmShow;
|
||||
bool m_isPreCurveShow;
|
||||
bool m_bEnableNan;//caodingfa:定时存盘周期可变时,原有逻辑会导致每个间隔插入一个Nan值,导致无效,为不影响原逻辑,增加一个开关
|
||||
|
||||
const int THREE_DAY = 3*24*60*60; // 查询全部数据时, 最多查询3天, 避免数据过多导致界面卡顿
|
||||
};
|
||||
|
||||
#endif // CPLOTWIDGET_H
|
||||
|
||||
@ -83,26 +83,28 @@
|
||||
<property name="verticalSpacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="adapt">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
<item row="0" column="10">
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>42</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>对比</string>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="CSWitchButton" name="switchBtn" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
@ -124,30 +126,59 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="5">
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="adapt">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>对比</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<widget class="QComboBox" name="comboBox_alarmStatus">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>130</width>
|
||||
<width>208</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="6">
|
||||
<item row="0" column="7">
|
||||
<widget class="QPushButton" name="collectCurve">
|
||||
<property name="text">
|
||||
<string>收藏</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="7">
|
||||
<item row="0" column="8">
|
||||
<widget class="QPushButton" name="plotExport">
|
||||
<property name="text">
|
||||
<string>导出</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="9">
|
||||
<widget class="QPushButton" name="plotPrint">
|
||||
<property name="text">
|
||||
<string>打印</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
@ -164,13 +195,6 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="8">
|
||||
<widget class="QPushButton" name="plotPrint">
|
||||
<property name="text">
|
||||
<string>打印</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<layout class="QGridLayout" name="timeLayout">
|
||||
<property name="leftMargin">
|
||||
@ -249,28 +273,23 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="9">
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
<item row="0" column="3">
|
||||
<widget class="QCheckBox" name="preCurve">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>24</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
<property name="text">
|
||||
<string>昨日曲线</string>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="CSWitchButton" name="switchBtn" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CRealTimeDataCollect.h"
|
||||
#include "CRealTimeDataCollect.h"
|
||||
#include "MessageChannel.h"
|
||||
#include "DataProcMessage.pb.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CREALTIMEDATACOLLECT_H
|
||||
#ifndef CREALTIMEDATACOLLECT_H
|
||||
#define CREALTIMEDATACOLLECT_H
|
||||
|
||||
#include <QThread>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTableDataModel.h"
|
||||
#include "CTableDataModel.h"
|
||||
|
||||
CTableDataModel::CTableDataModel(QObject *parent)
|
||||
: QAbstractTableModel(parent),
|
||||
@ -20,7 +20,7 @@ void CTableDataModel::clear()
|
||||
{
|
||||
beginResetModel();
|
||||
m_curveDataMap.clear();
|
||||
m_header.clear();
|
||||
//m_header.clear();
|
||||
m_timeList.clear();
|
||||
m_bAscs = true;
|
||||
endResetModel();
|
||||
@ -227,3 +227,31 @@ QVariant CTableDataModel::data(const QModelIndex &index, int role) const
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
CustomHeaderView::CustomHeaderView(Qt::Orientation orientation ,QWidget *parent)
|
||||
:QHeaderView(orientation,parent)
|
||||
{
|
||||
}
|
||||
CustomHeaderView::~CustomHeaderView()
|
||||
{
|
||||
}
|
||||
|
||||
void CustomHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
|
||||
{
|
||||
|
||||
//就简单几句
|
||||
//拿到text数据,在写数据的时候,设置textwordwrap,居中。
|
||||
QString textstr = model()->headerData(visualIndex(logicalIndex),Qt::Horizontal).toString();
|
||||
painter->save();
|
||||
//painter->drawText(rect,Qt::TextWordWrap | Qt::AlignCenter, textstr);
|
||||
// 从当前样式中获取边框颜色
|
||||
QStyleOptionHeader opt;
|
||||
initStyleOption(&opt);
|
||||
opt.rect = rect;
|
||||
opt.section = logicalIndex;
|
||||
|
||||
// 使用样式绘制边框
|
||||
style()->drawControl(QStyle::CE_HeaderSection, &opt, painter, this);
|
||||
painter->drawText(rect,Qt::TextWordWrap | Qt::AlignCenter, textstr);
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTABLEDATAMODEL_H
|
||||
#ifndef CTABLEDATAMODEL_H
|
||||
#define CTABLEDATAMODEL_H
|
||||
|
||||
#include <QAbstractTableModel>
|
||||
@ -37,5 +37,15 @@ private:
|
||||
QList<double> m_timeList;
|
||||
bool m_bAscs;
|
||||
};
|
||||
class CustomHeaderView : public QHeaderView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
CustomHeaderView(Qt::Orientation orientation = Qt::Horizontal,QWidget *parent = nullptr); //这里为了省事,给默认值为水平表头,因为我正好使用水平的表头
|
||||
~CustomHeaderView();
|
||||
|
||||
protected:
|
||||
virtual void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
|
||||
};
|
||||
#endif // CTABLEDATAMODEL_H
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTableView.h"
|
||||
#include "CTableView.h"
|
||||
#include <QHeaderView>
|
||||
|
||||
CTableView::CTableView(QWidget *parent)
|
||||
@ -30,3 +30,35 @@ void CTableView::setTableRowHeight(const int &nHeight)
|
||||
|
||||
verticalHeader()->setDefaultSectionSize(m_nTableRowHeight);
|
||||
}
|
||||
|
||||
void CTableView::showEvent(QShowEvent *event){
|
||||
QTableView::showEvent(event);
|
||||
adjustHeaderWidth();
|
||||
}
|
||||
|
||||
|
||||
// 自动调整表头宽度以适应文本
|
||||
void CTableView::adjustHeaderWidth() {
|
||||
QHeaderView *header = horizontalHeader();
|
||||
int sections = header->count();
|
||||
int maxWidth = 0;
|
||||
QFontMetrics fm(header->font());
|
||||
int maxWidthThreshold = 200; // 设置换行的阈值
|
||||
|
||||
for (int i = 0; i < sections; ++i) {
|
||||
QString text = model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
|
||||
int width = fm.width(text) + 10; // 加上一些额外空间
|
||||
maxWidth = qMax(maxWidth, width);
|
||||
}
|
||||
|
||||
for (int i = 0; i < sections; ++i) {
|
||||
QString text = model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
|
||||
int width = fm.width(text) + 10; // 加上一些额外空间
|
||||
// 如果宽度超过阈值,则换行
|
||||
if (width > maxWidthThreshold) {
|
||||
header->resizeSection(i, maxWidthThreshold);
|
||||
} else {
|
||||
header->resizeSection(i, maxWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTABLEVIEW_H
|
||||
#ifndef CTABLEVIEW_H
|
||||
#define CTABLEVIEW_H
|
||||
|
||||
#include <QTableView>
|
||||
@ -17,6 +17,9 @@ public:
|
||||
|
||||
int tableRowHeight();
|
||||
void setTableRowHeight(const int &nHeight);
|
||||
void adjustHeaderWidth();
|
||||
protected:
|
||||
void showEvent(QShowEvent *event) override ;
|
||||
|
||||
private:
|
||||
int m_nTableColWidth;
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
#include <QMessageBox>
|
||||
#include <QMessageBox>
|
||||
#include "CTrendEditDialog.h"
|
||||
#include "ui_CTrendEditDialog.h"
|
||||
#include "CTrendEditModel.h"
|
||||
#include "GraphTool/Retriever/CRetriever.h"
|
||||
#include "pub_utility_api/FileUtil.h"
|
||||
#include "CTableDataModel.h"
|
||||
|
||||
using namespace iot_dbms;
|
||||
|
||||
@ -16,6 +17,10 @@ CTrendEditDialog::CTrendEditDialog(QWidget *parent) :
|
||||
ui->setupUi(this);
|
||||
ui->m_retrieverWidget->setWindowFlags(Qt::Widget);
|
||||
ui->m_retrieverWidget->setMultVisible(false);
|
||||
ui->m_retrieverWidget->setCloseBtnVisible(false);
|
||||
ui->m_retrieverWidget->installEventFilter(this);
|
||||
ui->frame->setFixedWidth(320);
|
||||
setMinimumWidth(1200);
|
||||
//setWindowModality(Qt::WindowModal);
|
||||
initialize();
|
||||
connect(ui->addCurve, SIGNAL(clicked()), this, SLOT(slot_addCureve()));
|
||||
@ -53,6 +58,8 @@ void CTrendEditDialog::initTrendView()
|
||||
ui->trendView->setAlternatingRowColors(true);
|
||||
ui->trendView->horizontalHeader()->setStretchLastSection(true);
|
||||
|
||||
ui->trendView->setHorizontalHeader(new CustomHeaderView(Qt::Horizontal,ui->trendView));
|
||||
connect(ui->trendView->horizontalHeader(),&QHeaderView::sectionCountChanged,ui->trendView,&CTrendEditView::adjustHeaderWidth);
|
||||
connect(ui->m_retrieverWidget, &CRetriever::itemTagTriggered, ui->trendView, &CTrendEditView::appendTagName);
|
||||
}
|
||||
|
||||
@ -68,6 +75,16 @@ void CTrendEditDialog::resizeEvent(QResizeEvent *event)
|
||||
updateTrendViewColumnWidth();
|
||||
}
|
||||
|
||||
bool CTrendEditDialog::eventFilter(QObject *o, QEvent *e)
|
||||
{
|
||||
if( e->type() == QEvent::MouseMove )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return QDialog::eventFilter(o, e);
|
||||
}
|
||||
|
||||
|
||||
void CTrendEditDialog::updateTrendViewColumnWidth()
|
||||
{
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDEDITDIALOG_H
|
||||
#ifndef CTRENDEDITDIALOG_H
|
||||
#define CTRENDEDITDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
@ -28,6 +28,7 @@ public:
|
||||
protected:
|
||||
void showEvent(QShowEvent *event);
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
bool eventFilter(QObject *o, QEvent *e);
|
||||
|
||||
protected slots:
|
||||
void slot_updateTrend();
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include <QUuid>
|
||||
#include <QUuid>
|
||||
#include <QPainter>
|
||||
#include <QSpinBox>
|
||||
#include "CTrendGraph.h"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDEDITMODEL_H
|
||||
#ifndef CTRENDEDITMODEL_H
|
||||
#define CTRENDEDITMODEL_H
|
||||
|
||||
/*****************************************
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendEditView.h"
|
||||
#include "CTrendEditView.h"
|
||||
#include <QDragEnterEvent>
|
||||
#include <QDragMoveEvent>
|
||||
#include <QDropEvent>
|
||||
@ -50,6 +50,42 @@ void CTrendEditView::appendTagName(const QString &strTagName, const QString &str
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendEditView::adjustHeaderWidth()
|
||||
{
|
||||
QHeaderView *header = horizontalHeader();
|
||||
int sectionCount = header->count();
|
||||
if (sectionCount == 0 || !model()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QFontMetrics fontMetrics(header->font());
|
||||
const int maxWidthThreshold = 200;
|
||||
const int baseHeight = 30;
|
||||
int maxHeightMultiplier = 1;
|
||||
|
||||
for (int section = 0; section < sectionCount; ++section) {
|
||||
QString headerText = model()->headerData(section, Qt::Horizontal).toString();
|
||||
if (headerText.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int textWidth = fontMetrics.width(headerText) + 20; // 额外空间
|
||||
int heightMultiplier = 1;
|
||||
|
||||
// 调整宽度和计算换行高度
|
||||
if (textWidth > maxWidthThreshold) {
|
||||
header->resizeSection(section, maxWidthThreshold);
|
||||
heightMultiplier = qCeil(static_cast<qreal>(textWidth) / maxWidthThreshold);
|
||||
} else {
|
||||
header->resizeSection(section, textWidth);
|
||||
}
|
||||
|
||||
maxHeightMultiplier = qMax(maxHeightMultiplier, heightMultiplier);
|
||||
}
|
||||
|
||||
header->setFixedHeight(maxHeightMultiplier * baseHeight);
|
||||
}
|
||||
|
||||
void CTrendEditView::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasText())
|
||||
@ -96,3 +132,9 @@ void CTrendEditView::dropEvent(QDropEvent *event)
|
||||
}
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void CTrendEditView::showEvent(QShowEvent *event)
|
||||
{
|
||||
QTableView::showEvent(event);
|
||||
adjustHeaderWidth();
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDEDITVIEW_H
|
||||
#ifndef CTRENDEDITVIEW_H
|
||||
#define CTRENDEDITVIEW_H
|
||||
|
||||
#include "CTableView.h"
|
||||
@ -12,10 +12,12 @@ public:
|
||||
public slots:
|
||||
void appendTagName(const QString &strTagName, const QString &strTagDesc, bool isMulti);
|
||||
|
||||
void adjustHeaderWidth();
|
||||
protected:
|
||||
void dragEnterEvent(QDragEnterEvent *event);
|
||||
void dragMoveEvent(QDragMoveEvent *event);
|
||||
void dropEvent(QDropEvent *event);
|
||||
void showEvent(QShowEvent *event) override ;
|
||||
};
|
||||
|
||||
#endif // CTRENDEDITVIEW_H
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendFavTreeWidget.h"
|
||||
#include "CTrendFavTreeWidget.h"
|
||||
#include "CTrendEditDialog.h"
|
||||
#include <QDir>
|
||||
#include <QMenu>
|
||||
@ -159,12 +159,26 @@ void CTrendFavTreeWidget::slotEditTrendEdit()
|
||||
|
||||
void CTrendFavTreeWidget::slotRemoveTrendEdit()
|
||||
{
|
||||
int ret=QMessageBox::question(this, tr("提示"), tr("确定删除所选项吗?"), QMessageBox::Yes,QMessageBox::No);
|
||||
if(QMessageBox::Yes==ret)
|
||||
{
|
||||
QList<QTreeWidgetItem*> selectItem = selectedItems();
|
||||
foreach (QTreeWidgetItem *item, selectItem) {
|
||||
if( m_trendGraphMap.contains(item) )
|
||||
{
|
||||
CTrendGraph* graph = m_trendGraphMap[item];
|
||||
if( graph != NULL )
|
||||
{
|
||||
graph->clear();
|
||||
emit showTrendGraph(graph, "趋势图");
|
||||
}
|
||||
}
|
||||
|
||||
int index = indexOfTopLevelItem(item);
|
||||
takeTopLevelItem(index);
|
||||
}
|
||||
savaTrendGraph();
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendFavTreeWidget::slotItemChanged(QTreeWidgetItem *item, int column)
|
||||
@ -181,6 +195,8 @@ void CTrendFavTreeWidget::slotItemChanged(QTreeWidgetItem *item, int column)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
emit updateTitle(content);
|
||||
}
|
||||
|
||||
void CTrendFavTreeWidget::slotImport()
|
||||
@ -213,7 +229,7 @@ void CTrendFavTreeWidget::slotExport()
|
||||
|
||||
QString CTrendFavTreeWidget::getNewValidTitle()
|
||||
{
|
||||
QString title = QString("自定义趋势_");
|
||||
QString title = QString(tr("自定义趋势_"));
|
||||
QStringList listItemText;
|
||||
for(int nIndex(0); nIndex < topLevelItemCount(); nIndex++)
|
||||
{
|
||||
@ -348,6 +364,10 @@ void CTrendFavTreeWidget::savaTrendGraph(const QString &filePath, const QList<QT
|
||||
for(int nCurveIndex(0); nCurveIndex < listCurve.size(); nCurveIndex++)
|
||||
{
|
||||
Curve curve = listCurve.at(nCurveIndex);
|
||||
if(curve.curveType != enRealCurve)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
QDomElement item = document.createElement("item");
|
||||
item.setAttribute("tag", curve.tag);
|
||||
item.setAttribute("color", curve.color.rgb());
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDFAVTREEWIDGET_H
|
||||
#ifndef CTRENDFAVTREEWIDGET_H
|
||||
#define CTRENDFAVTREEWIDGET_H
|
||||
|
||||
#include <QTreeWidget>
|
||||
@ -20,6 +20,7 @@ public:
|
||||
|
||||
signals:
|
||||
void showTrendGraph(CTrendGraph * graph, QString name);
|
||||
void updateTitle(QString name);
|
||||
|
||||
public slots:
|
||||
void collectGraph(const QString &title, const CTrendGraph &graph);
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendGraph.h"
|
||||
#include "CTrendGraph.h"
|
||||
#include <QDateTime>
|
||||
#include "plot/qcustomplot.h"
|
||||
|
||||
@ -34,24 +34,28 @@ const QList<QColor> CTrendGraph::curveColors() const
|
||||
return list;
|
||||
}
|
||||
|
||||
const Curve &CTrendGraph::curve(const QString &tag) const
|
||||
const Curve &CTrendGraph::curve(const QString &tag, const int &curType) const
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
return m_listCurve.at(nIndex);
|
||||
}
|
||||
}
|
||||
|
||||
Q_ASSERT_X(false, "CTrendGraph::curve", "curve is not exists");
|
||||
|
||||
static Curve invalid;
|
||||
return invalid;
|
||||
}
|
||||
|
||||
int CTrendGraph::index(const QString &tag) const
|
||||
int CTrendGraph::index(const QString &tag, const int &curType) const
|
||||
{
|
||||
//< TODO 性能
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
return nIndex;
|
||||
}
|
||||
@ -69,17 +73,28 @@ void CTrendGraph::addCurve(const Curve &curve)
|
||||
m_listCurve.append(curve);
|
||||
}
|
||||
|
||||
int CTrendGraph::removeCurve(const QString &tag)
|
||||
QList<int> CTrendGraph::removeCurve(const QString &tag)
|
||||
{
|
||||
QList<int> removeList;
|
||||
for(int nIndex(m_listCurve.size() - 1); nIndex >= 0; nIndex--)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
{
|
||||
m_listCurve.removeAt(nIndex);
|
||||
return nIndex;
|
||||
removeList.append(nIndex);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
return removeList;
|
||||
}
|
||||
|
||||
bool CTrendGraph::removeCurve(const int &nIndex)
|
||||
{
|
||||
if(nIndex < 0 || nIndex >= m_listCurve.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
m_listCurve.removeAt(nIndex);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CTrendGraph::setCurveVisible(const int &nIndex, const bool &visible)
|
||||
@ -112,11 +127,11 @@ void CTrendGraph::setCurveGraphOffset(const int &nIndex, const double &offset)
|
||||
m_listCurve[nIndex].graphOffset = offset;
|
||||
}
|
||||
|
||||
void CTrendGraph::setCurveHisDataValue(const QString &tag, const double &max, const double &min, const double &maxTime, const double &minTime, const double &average, const double &accuml, const Range &range)
|
||||
void CTrendGraph::setCurveHisDataValue(const QString &tag, const int &curType, const double &max, const double &min, const double &maxTime, const double &minTime, const double &average, const double &accuml, const Range &range)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
m_listCurve[nIndex].hisMax = max;
|
||||
m_listCurve[nIndex].hisMin = min;
|
||||
@ -132,7 +147,7 @@ void CTrendGraph::setCurveHisDataValue(const QString &tag, const double &max, co
|
||||
void CTrendGraph::pushCurveRTDataValue(const QString &tag, const double &key, const double &value, const int &status)
|
||||
{
|
||||
//< 保留20min实时数据
|
||||
int nIndex = m_listCurve.indexOf(tag);
|
||||
int nIndex = m_listCurve.indexOf(tag); //< 实时数据索引一定在前面
|
||||
if (-1 == nIndex || qIsNaN(value))
|
||||
{
|
||||
return;
|
||||
@ -148,11 +163,11 @@ void CTrendGraph::pushCurveRTDataValue(const QString &tag, const double &key, co
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendGraph::setCurveStatisMax(const QString &tag, const double &max, const double &maxTime)
|
||||
void CTrendGraph::setCurveStatisMax(const QString &tag, const int &curType, const double &max, const double &maxTime)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
m_listCurve[nIndex].sHisMax = max;
|
||||
m_listCurve[nIndex].sHisMaxTime = maxTime;
|
||||
@ -160,11 +175,11 @@ void CTrendGraph::setCurveStatisMax(const QString &tag, const double &max, const
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendGraph::setCurveStatisMin(const QString &tag, const double &min, const double &minTime)
|
||||
void CTrendGraph::setCurveStatisMin(const QString &tag, const int &curType, const double &min, const double &minTime)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
m_listCurve[nIndex].sHisMin = min;
|
||||
m_listCurve[nIndex].sHisMinTime = minTime;
|
||||
@ -172,11 +187,11 @@ void CTrendGraph::setCurveStatisMin(const QString &tag, const double &min, const
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendGraph::resetCurveStatisMax(const QString &tag)
|
||||
void CTrendGraph::resetCurveStatisMax(const QString &tag, const int &curType)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
m_listCurve[nIndex].sHisMax = -DBL_MAX;
|
||||
m_listCurve[nIndex].sHisMaxTime = -DBL_MAX;
|
||||
@ -184,11 +199,11 @@ void CTrendGraph::resetCurveStatisMax(const QString &tag)
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendGraph::resetCurveStatisMin(const QString &tag)
|
||||
void CTrendGraph::resetCurveStatisMin(const QString &tag, const int &curType)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == tag)
|
||||
if(m_listCurve.at(nIndex).tag == tag && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
m_listCurve[nIndex].sHisMin = DBL_MAX;
|
||||
m_listCurve[nIndex].sHisMinTime = DBL_MAX;
|
||||
@ -196,11 +211,11 @@ void CTrendGraph::resetCurveStatisMin(const QString &tag)
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendGraph::updateRTCurveStatisticsInfo(const QString &strTagName)
|
||||
void CTrendGraph::updateRTCurveStatisticsInfo(const QString &strTagName, const int &curType)
|
||||
{
|
||||
for(int nIndex(0); nIndex < m_listCurve.size(); nIndex++)
|
||||
{
|
||||
if(m_listCurve.at(nIndex).tag == strTagName)
|
||||
if(m_listCurve.at(nIndex).tag == strTagName && m_listCurve.at(nIndex).curveType == curType)
|
||||
{
|
||||
updateRTCurveStatisticsInfo(m_listCurve[nIndex]);
|
||||
return;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDGRAPH_H
|
||||
#ifndef CTRENDGRAPH_H
|
||||
#define CTRENDGRAPH_H
|
||||
|
||||
#include <QString>
|
||||
@ -28,9 +28,15 @@ struct Range
|
||||
double max;
|
||||
};
|
||||
|
||||
enum Type
|
||||
{
|
||||
enRealCurve = 0, //< 实际测点曲线
|
||||
enPrevCurve //< 昨日曲线
|
||||
};
|
||||
|
||||
struct Curve
|
||||
{
|
||||
Curve(const QString &strTagName = QString())
|
||||
Curve(const QString &strTagName = QString(), Type type = enRealCurve)
|
||||
: visible(true),
|
||||
rtMax(-DBL_MAX),
|
||||
rtMin(DBL_MAX),
|
||||
@ -56,11 +62,12 @@ struct Curve
|
||||
desc(QString()),
|
||||
type(QString()),
|
||||
unit(QString()),
|
||||
color(QColor()){}
|
||||
color(QColor()),
|
||||
curveType(type){}
|
||||
|
||||
inline bool operator==(const Curve &curve) const
|
||||
{
|
||||
return tag == curve.tag;
|
||||
return ((tag == curve.tag) && (curveType == curve.curveType));
|
||||
}
|
||||
|
||||
inline bool operator==(const QString &strTagName) const
|
||||
@ -97,6 +104,7 @@ struct Curve
|
||||
QString type;
|
||||
QString unit;
|
||||
QColor color;
|
||||
Type curveType;
|
||||
|
||||
QVector< QPair <double, QPair< double, int > > > values;
|
||||
};
|
||||
@ -113,13 +121,14 @@ public:
|
||||
|
||||
const QList<QColor> curveColors() const;
|
||||
|
||||
const Curve &curve(const QString &tag) const;
|
||||
int index(const QString &tag) const;
|
||||
const Curve &curve(const QString &tag, const int &curType) const;
|
||||
int index(const QString &tag, const int &curType = enRealCurve) const;
|
||||
|
||||
void clear();
|
||||
|
||||
void addCurve(const Curve &curve);
|
||||
int removeCurve(const QString &tag);
|
||||
QList<int> removeCurve(const QString &tag);
|
||||
bool removeCurve(const int &nIndex);
|
||||
|
||||
void setCurveVisible(const int &nIndex, const bool &visible);
|
||||
|
||||
@ -127,20 +136,20 @@ public:
|
||||
void setCurveFactor(const int &nIndex, const double &factor);
|
||||
void setCurveOffset(const int &nIndex, const double &offset);
|
||||
|
||||
void setCurveHisDataValue(const QString &tag, const double &max, const double &min, const double &maxTime, const double &minTime, const double &average, const double &accuml, const Range &range);
|
||||
void setCurveHisDataValue(const QString &tag, const int &curType, const double &max, const double &min, const double &maxTime, const double &minTime, const double &average, const double &accuml, const Range &range);
|
||||
void pushCurveRTDataValue(const QString &tag, const double &key, const double &value, const int &status);
|
||||
|
||||
void setCurveStatisMax(const QString &tag, const double &max, const double &maxTime);
|
||||
void setCurveStatisMin(const QString &tag, const double &min, const double &minTime);
|
||||
void setCurveStatisMax(const QString &tag, const int &curType, const double &max, const double &maxTime);
|
||||
void setCurveStatisMin(const QString &tag, const int &curType, const double &min, const double &minTime);
|
||||
|
||||
void resetCurveStatisMax(const QString &tag);
|
||||
void resetCurveStatisMin(const QString &tag);
|
||||
void resetCurveStatisMax(const QString &tag, const int &curType);
|
||||
void resetCurveStatisMin(const QString &tag, const int &curType);
|
||||
|
||||
void setCurveGraphFactor(const int &nIndex, const double &factor);
|
||||
void setCurveGraphOffset(const int &nIndex, const double &offset);
|
||||
|
||||
//< 更新实时曲线统计信息
|
||||
void updateRTCurveStatisticsInfo(const QString &strTagName);
|
||||
void updateRTCurveStatisticsInfo(const QString &strTagName, const int &curType);
|
||||
void updateRTCurveStatisticsInfo(Curve &curve);
|
||||
|
||||
private:
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
#include "CTrendInfoManage.h"
|
||||
#include "CTrendInfoManage.h"
|
||||
#include "service/perm_mng_api/PermMngApi.h"
|
||||
#include "pub_sysinfo_api/SysInfoApi.h"
|
||||
#include "pub_utility_api/CharUtil.h"
|
||||
#include "pub_utility_api/FileUtil.h"
|
||||
#include "perm_mng_api/PermMngApi.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include <QDomDocument>
|
||||
|
||||
using namespace iot_dbms;
|
||||
using namespace iot_public;
|
||||
@ -23,6 +24,8 @@ CTrendInfoManage *CTrendInfoManage::instance()
|
||||
|
||||
CTrendInfoManage::CTrendInfoManage()
|
||||
{
|
||||
m_bLoadTagInfoWhenInit = false; //默认加载所有信息
|
||||
loadCfg(); //加载配置文件,会重新覆盖掉默认参数值
|
||||
//< 实时库
|
||||
m_rtdbAccess = new iot_dbms::CRdbAccess();
|
||||
|
||||
@ -40,7 +43,13 @@ CTrendInfoManage::CTrendInfoManage()
|
||||
loadRTLocation();
|
||||
loadDevGroupInfo(pReadDb);
|
||||
loadDeviceInfo(pReadDb);
|
||||
loadTagInfo(pReadDb);
|
||||
|
||||
//通过setEnableDynamicLoadTag函数加载了,默认不加载测点,防止测点太多打开趋势页面太慢
|
||||
//loadAllTagInfo(pReadDb);
|
||||
if(m_bLoadTagInfoWhenInit)
|
||||
{
|
||||
loadAllTagInfo(pReadDb);
|
||||
}
|
||||
loadStateDefine();
|
||||
loadAlarmStatusDefine();
|
||||
loadAlarmStatus();
|
||||
@ -61,7 +70,6 @@ void CTrendInfoManage::destory()
|
||||
|
||||
m_locationInfo.clear();
|
||||
m_devGroupInfo.clear();
|
||||
m_devLocation.clear();
|
||||
m_deviceInfo.clear();
|
||||
m_listTagName.clear();
|
||||
m_listTagInfo.clear();
|
||||
@ -255,6 +263,50 @@ QMap<int, QString> CTrendInfoManage::getAlarmOtherStatus()
|
||||
return m_alarmOtherStatus;
|
||||
}
|
||||
|
||||
bool CTrendInfoManage::loadTagInfoByDevGroup(const QString &strDevGrpTag)
|
||||
{
|
||||
auto iter = m_deviceInfo.find(strDevGrpTag);
|
||||
if(iter == m_deviceInfo.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return loadTagInfoByDevTag(iter.value().keys());
|
||||
}
|
||||
|
||||
bool CTrendInfoManage::loadTagInfoByDevTag(const QStringList &listDevTag)
|
||||
{
|
||||
QStringList queryDevTag;
|
||||
foreach (QString strCur, listDevTag)
|
||||
{
|
||||
if(m_listTagName.contains(strCur)) //已经加载过了就不再加载了
|
||||
{
|
||||
continue;
|
||||
}
|
||||
queryDevTag.push_back(strCur);
|
||||
}
|
||||
|
||||
if(queryDevTag.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CDbApi * pReadDb = new CDbApi(DB_CONN_MODEL_READ);
|
||||
if(!pReadDb->open())
|
||||
{
|
||||
delete pReadDb;
|
||||
pReadDb = Q_NULLPTR;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bRet = loadTagInfo(pReadDb,listDevTag);
|
||||
|
||||
delete pReadDb;
|
||||
pReadDb = Q_NULLPTR;
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
void CTrendInfoManage::loadRTLocation()
|
||||
{
|
||||
iot_service::CPermMngApiPtr permMngPtr = iot_service::getPermMngInstance("base");
|
||||
@ -377,18 +429,21 @@ void CTrendInfoManage::loadDeviceInfo(CDbApi *pReadDb)
|
||||
pReadDb->execute(sqlSequenceQuery, query);
|
||||
while(query.next())
|
||||
{
|
||||
const QString &tag_name = query.value(0).toString();
|
||||
const QString &description = query.value(1).toString();
|
||||
const QString &group_tag_name = query.value(2).toString();
|
||||
const int location_id = query.value(0).toInt();
|
||||
//const QString &tag_name = query.value(0).toString();
|
||||
//const QString &description = query.value(1).toString();
|
||||
//const QString &group_tag_name = query.value(2).toString();
|
||||
|
||||
m_deviceInfo[group_tag_name].insert(tag_name, description);
|
||||
m_devLocation[location_id].insert(tag_name, description);
|
||||
m_deviceInfo[query.value(2).toString()].insert(query.value(0).toString(), query.value(1).toString());
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendInfoManage::loadTagInfo(CDbApi *pReadDb)
|
||||
bool CTrendInfoManage::loadTagInfo(CDbApi *pReadDb, const QStringList &listDevice)
|
||||
{
|
||||
if(listDevice.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QSqlQuery query;
|
||||
QStringList listType;
|
||||
listType.append(QStringLiteral("analog"));
|
||||
@ -396,19 +451,8 @@ void CTrendInfoManage::loadTagInfo(CDbApi *pReadDb)
|
||||
listType.append(QStringLiteral("accuml"));
|
||||
// listType.append(QString("mix"));
|
||||
|
||||
QString strDeviceFilter;
|
||||
if(!m_deviceInfo.isEmpty())
|
||||
{
|
||||
QStringList listDevice;
|
||||
QMap<QString, QMap<QString, QString> >::const_iterator iter = m_deviceInfo.constBegin();
|
||||
while (iter != m_deviceInfo.constEnd())
|
||||
{
|
||||
listDevice.append(iter.value().keys());
|
||||
++iter;
|
||||
}
|
||||
strDeviceFilter = "'" % listDevice.join("', '") % "'";
|
||||
QString strDeviceFilter = "'" % listDevice.join("', '") % "'";
|
||||
strDeviceFilter = QString("(%1 in (%2))").arg("device").arg(strDeviceFilter);
|
||||
}
|
||||
|
||||
query.setForwardOnly(true);
|
||||
for(int nIndex(0); nIndex < listType.size(); nIndex++)
|
||||
@ -425,6 +469,7 @@ FROM %2 as t1 left join dev_info as t2 on t1.device = t2.tag_name").arg(strUnitF
|
||||
{
|
||||
sqlSequenceQuery.append(QString(" WHERE %1 ORDER BY SEQ_NO asc;").arg(strDeviceFilter));
|
||||
}
|
||||
|
||||
pReadDb->execute(sqlSequenceQuery, query);
|
||||
while(query.next())
|
||||
{
|
||||
@ -436,18 +481,25 @@ FROM %2 as t1 left join dev_info as t2 on t1.device = t2.tag_name").arg(strUnitF
|
||||
//const QString devDesc = query.value(5).toString();
|
||||
const QString strDescription = m_locationInfo[location] % QChar('.') % m_devGroupInfo[location][query.value(0).toString()] % QChar('.') % query.value(5).toString() % QChar('.') % query.value(2).toString();
|
||||
m_listTagName[device] << tagName;
|
||||
|
||||
|
||||
//QString strUnitDesc = m_listTagUnit.value(query.value(5).toInt(), QString());
|
||||
// m_listTagInfo[tagName] = QStringList() << strDescription << strCurType << m_listTagUnit.value(query.value(5).toInt(), QString());
|
||||
QString strUnitDesc ="";
|
||||
if(QStringLiteral("analog") == strCurType || QStringLiteral("accuml") == strCurType)
|
||||
m_listTagInfo[tagName] = QStringList() << strDescription << strCurType << m_listTagUnit.value(query.value(6).toInt(), QString());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CTrendInfoManage::loadAllTagInfo(iot_dbms::CDbApi *pReadDb)
|
||||
{
|
||||
QStringList listDevice;
|
||||
QMap<QString, QMap<QString, QString> >::const_iterator iter = m_deviceInfo.constBegin();
|
||||
while (iter != m_deviceInfo.constEnd())
|
||||
{
|
||||
strUnitDesc = m_listTagUnit.value(query.value(6).toInt(), QString());
|
||||
}
|
||||
m_listTagInfo[tagName] = QStringList() << strDescription << strCurType << strUnitDesc;
|
||||
}
|
||||
listDevice.append(iter.value().keys());
|
||||
++iter;
|
||||
}
|
||||
|
||||
loadTagInfo(pReadDb,listDevice);
|
||||
}
|
||||
|
||||
void CTrendInfoManage::loadUnit(CDbApi *pReadDb)
|
||||
@ -608,3 +660,47 @@ void CTrendInfoManage::initInvalidStatus()
|
||||
m_nInvalidDigital |= (temp << getStateActualValue("MENU_STATE_DI_SINHIBIT_REF")); //< 屏蔽禁止刷新
|
||||
m_nInvalidDigital |= (temp << getStateActualValue("MENU_STATE_DI_SOURCE_ABNORMAL"));//< 数据来源不正常
|
||||
}
|
||||
|
||||
void CTrendInfoManage::loadCfg()
|
||||
{
|
||||
QDomDocument document;
|
||||
QString strFileName = QString::fromStdString(iot_public::CFileUtil::getCurModuleDir()) + QString("../../data/model/trend.xml");
|
||||
QFile file(strFileName);
|
||||
if (!file.open(QIODevice::ReadOnly))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!document.setContent(&file))
|
||||
{
|
||||
file.close();
|
||||
return;
|
||||
}
|
||||
file.close();
|
||||
|
||||
QDomElement root = document.documentElement();
|
||||
if(root.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QDomNodeList paramNodeList = root.elementsByTagName("param");
|
||||
for(int graphIndex(0); graphIndex < paramNodeList.size(); graphIndex++)
|
||||
{
|
||||
QDomNode paramNode = paramNodeList.at(graphIndex);
|
||||
if(paramNode.isNull())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
QDomElement paramElement = paramNode.toElement();
|
||||
if(!paramElement.isNull())
|
||||
{
|
||||
QString name = paramElement.attribute("name", QString());
|
||||
QString value = paramElement.attribute("value", QString());
|
||||
if(name == "loadTagInfoWhenInit")
|
||||
{
|
||||
m_bLoadTagInfoWhenInit = (value == "1");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDINFOMANAGE_H
|
||||
#ifndef CTRENDINFOMANAGE_H
|
||||
#define CTRENDINFOMANAGE_H
|
||||
|
||||
#include <QMap>
|
||||
@ -7,7 +7,19 @@
|
||||
#include <QStringList>
|
||||
#include "dbms/rdb_api/CRdbAccess.h"
|
||||
#include "dbms/db_api_ex/CDbApi.h"
|
||||
|
||||
//< 屏蔽xml_parser编译告警
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-copy"
|
||||
#endif
|
||||
|
||||
#include "boost/property_tree/xml_parser.hpp"
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#include "boost/typeof/typeof.hpp"
|
||||
#include "boost/filesystem.hpp"
|
||||
|
||||
@ -62,13 +74,20 @@ public:
|
||||
|
||||
QMap<int, QString> getAlarmOtherStatus();
|
||||
|
||||
//加载指定设备组下测点的信息,为空代表加载所有设备组的测点
|
||||
bool loadTagInfoByDevGroup(const QString &strDevGrpTag);
|
||||
//加载指定设备下的测点信息,为空代表加载所有设备
|
||||
bool loadTagInfoByDevTag(const QStringList &listDevTag);
|
||||
|
||||
private:
|
||||
CTrendInfoManage();
|
||||
|
||||
void loadRTLocation();
|
||||
void loadDevGroupInfo(iot_dbms::CDbApi *pReadDb); //新增设备组
|
||||
void loadDeviceInfo(iot_dbms::CDbApi *pReadDb); //新增设备组时修改
|
||||
void loadTagInfo(iot_dbms::CDbApi *pReadDb);
|
||||
//strDevGrpTag为空加载所有设备组,如果不为空加载指定的设备组
|
||||
bool loadTagInfo(iot_dbms::CDbApi *pReadDb,const QStringList &listDevice = QStringList());
|
||||
void loadAllTagInfo(iot_dbms::CDbApi *pReadDb);
|
||||
void loadUnit(iot_dbms::CDbApi *pReadDb);
|
||||
void loadStateDefine();
|
||||
void loadAlarmStatusDefine();
|
||||
@ -76,12 +95,13 @@ private:
|
||||
void loadAlarmOtherStatus();
|
||||
void initInvalidStatus();
|
||||
|
||||
void loadCfg();
|
||||
|
||||
private:
|
||||
iot_dbms::CRdbAccess * m_rtdbAccess;
|
||||
QMap<int, QString> m_locationInfo; //< LocationID-LocationDesc
|
||||
QMap<int, QMap<QString, QString> > m_devGroupInfo; //< LocationID-<DevGroupName-DevGroupDesc> 新增设备组
|
||||
QMap<int, QList<QPair<QString,QString > > > m_devGroupInfoMap;
|
||||
QMap<int, QMap<QString, QString> > m_devLocation; //< LocationID-<DeviceName-DeviceDesc> 新增设备组
|
||||
QMap<QString, QMap<QString, QString> > m_deviceInfo; //< DevGroupName-<DeviceName-DeviceDesc> 新增设备组时修改
|
||||
QMap<QString, QStringList> m_listTagName; //< DeviceName-list<TagName>
|
||||
QHash<QString, QStringList> m_listTagInfo; //< TagName-TagInfo<desc, type, unit>
|
||||
@ -93,7 +113,7 @@ private:
|
||||
QList<int> m_locationOrderList; //< location_id: 按location_no排序
|
||||
int m_nInvalidAnalog;
|
||||
int m_nInvalidDigital;
|
||||
|
||||
bool m_bLoadTagInfoWhenInit; //第一次是否加载所有的测点数据,默认加载
|
||||
static CTrendInfoManage * m_pInstance;
|
||||
};
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include <QWidget>
|
||||
#include <QWidget>
|
||||
#include "CTrendPluginWidget.h"
|
||||
#include "CTrendWindow.h"
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDPLUGINWIDGET_H
|
||||
#ifndef CTRENDPLUGINWIDGET_H
|
||||
#define CTRENDPLUGINWIDGET_H
|
||||
|
||||
#include <QObject>
|
||||
@ -7,7 +7,7 @@
|
||||
class CTrendPluginWidget : public QObject, public CPluginWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "kbd.PluginWidgetInterface/1.0")
|
||||
Q_PLUGIN_METADATA(IID HMI_WidgetPlugin_IID)
|
||||
Q_INTERFACES(CPluginWidgetInterface)
|
||||
|
||||
public:
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include <QStringList>
|
||||
#include <QStringList>
|
||||
#include "CTrendTreeItem.h"
|
||||
|
||||
CTrendTreeItem::CTrendTreeItem(int type)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/****************************************************************************
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendTreeModel.h"
|
||||
#include "CTrendTreeModel.h"
|
||||
#include "CTrendInfoManage.h"
|
||||
#include <QTimer>
|
||||
#include "pub_logger_api/logger.h"
|
||||
@ -65,13 +65,12 @@ void CTrendTreeModel::initTrendTagInfo()
|
||||
++iter_device;
|
||||
continue;
|
||||
}
|
||||
// QTreeWidgetItem * devItem = new QTreeWidgetItem(devGroupItem, QStringList() << iter_device.value(), DEV_TYPE);
|
||||
// devItem->setData(0, ItemTagRole, iter_device.key());
|
||||
QTreeWidgetItem * devItem = new QTreeWidgetItem(devGroupItem, QStringList() << iter_device.value(), DEV_TYPE);
|
||||
devItem->setData(0, ItemTagRole, iter_device.key());
|
||||
QStringList::const_iterator iter_tag = listTagName.constBegin();
|
||||
while (iter_tag != listTagName.constEnd())
|
||||
{
|
||||
// QTreeWidgetItem * tagItem = new QTreeWidgetItem(devItem, QStringList() << CTrendInfoManage::instance()->getTagDescription(*iter_tag).section(".", -1), TAG_TYPE);
|
||||
QTreeWidgetItem * tagItem = new QTreeWidgetItem(devGroupItem, QStringList() << CTrendInfoManage::instance()->getTagDescription(*iter_tag).section(".", -1), TAG_TYPE);
|
||||
QTreeWidgetItem * tagItem = new QTreeWidgetItem(devItem, QStringList() << CTrendInfoManage::instance()->getTagDescription(*iter_tag).section(".", -1), TAG_TYPE);
|
||||
tagItem->setData(0, ItemTagRole, *iter_tag);
|
||||
tagItem->setToolTip(0, *iter_tag);
|
||||
++iter_tag;
|
||||
@ -86,10 +85,10 @@ void CTrendTreeModel::initTrendTagInfo()
|
||||
{
|
||||
return;
|
||||
}
|
||||
for(int n=0; n<m_rootItem->childCount(); n++)
|
||||
{
|
||||
m_pView->expand(index(n,0));
|
||||
}
|
||||
// for(int n=0; n<m_rootItem->childCount(); n++)
|
||||
// {
|
||||
// m_pView->expand(index(n,0));
|
||||
// }
|
||||
}
|
||||
|
||||
void CTrendTreeModel::clearTrendTagInfo()
|
||||
@ -210,7 +209,6 @@ QVariant CTrendTreeModel::data(const QModelIndex &index, int role) const
|
||||
|
||||
bool CTrendTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
|
||||
if(!index.isValid())
|
||||
{
|
||||
return false;
|
||||
@ -220,9 +218,13 @@ bool CTrendTreeModel::setData(const QModelIndex &index, const QVariant &value, i
|
||||
if(item)
|
||||
{
|
||||
if(Qt::CheckStateRole == role)
|
||||
{
|
||||
//只有状态发生变化才更新,否则在单个设备测点数量过多的时候,清空动作会时间很长
|
||||
if(item->checkState(0) != value.toInt())
|
||||
{
|
||||
emit itemCheckStateChanged(item->data(0, ItemTagRole).toString(), value.toInt());
|
||||
}
|
||||
}
|
||||
item->setData(index.column(), role, value);
|
||||
}
|
||||
|
||||
@ -254,8 +256,7 @@ void CTrendTreeModel::setChildrenCheckState(const QModelIndex &index, const Qt::
|
||||
{
|
||||
return;
|
||||
}
|
||||
// if(DEV_TYPE == item->type())
|
||||
if(DEV_GROUP_TYPE == item->type())
|
||||
if(DEV_TYPE == item->type())
|
||||
{
|
||||
for(int nChildIndex(0); nChildIndex < item->childCount(); nChildIndex++)
|
||||
{
|
||||
@ -279,6 +280,22 @@ void CTrendTreeModel::updateNodeVisualState(const QString &content, QItemSelecti
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendTreeModel::loadTagInfoByDevGroup(const QString &strDevGrpTag)
|
||||
{
|
||||
if(CTrendInfoManage::instance()->loadTagInfoByDevGroup(strDevGrpTag))
|
||||
{
|
||||
initTrendTagInfo();
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendTreeModel::loadTagInfoByDevTag(const QStringList &listDevTag)
|
||||
{
|
||||
if(CTrendInfoManage::instance()->loadTagInfoByDevTag(listDevTag))
|
||||
{
|
||||
initTrendTagInfo();
|
||||
}
|
||||
}
|
||||
|
||||
bool CTrendTreeModel::traverNode(const QString &content, const QModelIndex &index, QItemSelection &selection)
|
||||
{
|
||||
if(!index.isValid())
|
||||
@ -378,16 +395,16 @@ void CTrendTreeModel::updateTagCheckState(const QString &tag, const bool &checke
|
||||
QTreeWidgetItem * deviceGroupItem = locationItem->child(nDeviceGroupRow);
|
||||
for(int nDeviceRow(0); nDeviceRow < deviceGroupItem->childCount(); nDeviceRow++)
|
||||
{
|
||||
// QTreeWidgetItem * deviceItem = deviceGroupItem->child(nDeviceRow);
|
||||
// for(int nTagRow(0); nTagRow < deviceItem->childCount(); nTagRow++)
|
||||
// {
|
||||
QTreeWidgetItem * tagItem = deviceGroupItem->child(nDeviceRow);
|
||||
QTreeWidgetItem * deviceItem = deviceGroupItem->child(nDeviceRow);
|
||||
for(int nTagRow(0); nTagRow < deviceItem->childCount(); nTagRow++)
|
||||
{
|
||||
QTreeWidgetItem * tagItem = deviceItem->child(nTagRow);
|
||||
if(tag == tagItem->data(0, ItemTagRole).toString())
|
||||
{
|
||||
tagItem->setCheckState(0, checked ? Qt::Checked : Qt::Unchecked);
|
||||
return;
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDTREEMODEL_H
|
||||
#ifndef CTRENDTREEMODEL_H
|
||||
#define CTRENDTREEMODEL_H
|
||||
|
||||
#include <QTreeWidgetItem>
|
||||
@ -45,6 +45,12 @@ public:
|
||||
|
||||
void updateNodeVisualState(const QString &content, QItemSelection &selection);
|
||||
|
||||
//加载指定设备组下测点的信息,为空代表加载所有设备组的测点
|
||||
void loadTagInfoByDevGroup(const QString &strDevGrpTag);
|
||||
|
||||
//加载指定设备下的测点信息,为空代表加载所有设备
|
||||
void loadTagInfoByDevTag(const QStringList &listDevTag);
|
||||
|
||||
signals:
|
||||
void itemCheckStateChanged(const QString &strTagName, const int &checkedState);
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendTreeView.h"
|
||||
#include "CTrendTreeView.h"
|
||||
#include "CTrendTreeModel.h"
|
||||
#include <QMenu>
|
||||
#include <QMouseEvent>
|
||||
@ -18,8 +18,7 @@ void CTrendTreeView::contextMenuEvent(QContextMenuEvent *event)
|
||||
QTreeWidgetItem * pItem = static_cast<QTreeWidgetItem*>(indexAt(event->pos()).internalPointer());
|
||||
if(Q_NULLPTR != pItem)
|
||||
{
|
||||
// if(DEV_TYPE == pItem->type())
|
||||
if(DEV_GROUP_TYPE == pItem->type())
|
||||
if(DEV_TYPE == pItem->type())
|
||||
{
|
||||
QMenu menu;
|
||||
menu.addAction(tr("全选"), [=](){ pModel->setChildrenCheckState(indexAt(event->pos()), Qt::Checked); });
|
||||
@ -54,6 +53,12 @@ void CTrendTreeView::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
pModel->setData(index, state, Qt::CheckStateRole);
|
||||
update();
|
||||
}
|
||||
else if(DEV_GROUP_TYPE == pItem->type())
|
||||
{
|
||||
int row=pModel->parent(index).row();
|
||||
pModel->loadTagInfoByDevGroup(pItem->data(0,ItemTagRole).toString());
|
||||
expand(pModel->index(row,0));
|
||||
}
|
||||
}
|
||||
}
|
||||
return QTreeView::mouseDoubleClickEvent(event);
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTrendWindow.h"
|
||||
#include "CTrendWindow.h"
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QSplitter>
|
||||
@ -218,6 +218,14 @@ void CTrendWindow::setAlarmPointVisible(bool visible)
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendWindow::setPreCurveVisible(bool visible)
|
||||
{
|
||||
if(m_plotWidget)
|
||||
{
|
||||
m_plotWidget->setPreCurveVisible(visible);
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendWindow::initWindow()
|
||||
{
|
||||
m_pTagWidget = new QTabWidget(this);
|
||||
@ -246,6 +254,8 @@ void CTrendWindow::initWindow()
|
||||
m_pTagWidget->addTab(pFavoritesTreeWidget, tr("收藏夹"));
|
||||
m_pTagWidget->setContentsMargins(1,1,1,1);
|
||||
m_pTagWidget->setCurrentIndex(1);
|
||||
m_pTagWidget->setMinimumWidth(290);
|
||||
|
||||
m_plotWidget = new CPlotWidget(this);
|
||||
m_plotWidget->initialize();
|
||||
m_pSplitter = new QSplitter(this);
|
||||
@ -264,6 +274,7 @@ void CTrendWindow::initWindow()
|
||||
connect(m_plotWidget, &CPlotWidget::updateTagCheckState, m_pTrendTreeModel, &CTrendTreeModel::updateTagCheckState, Qt::QueuedConnection);
|
||||
connect(m_pTrendTreeModel, &CTrendTreeModel::itemCheckStateChanged, this, &CTrendWindow::itemCheckStateChanged);
|
||||
connect(pFavoritesTreeWidget, &CTrendFavTreeWidget::showTrendGraph, this, &CTrendWindow::showTrendGraph);
|
||||
connect(pFavoritesTreeWidget, &CTrendFavTreeWidget::updateTitle, this, &CTrendWindow::setTitle);
|
||||
|
||||
if(!m_isEditMode)
|
||||
{
|
||||
@ -480,6 +491,13 @@ void CTrendWindow::updateTrendName(const QString &title)
|
||||
|
||||
void CTrendWindow::showTrendGraph(CTrendGraph *graph, const QString &name)
|
||||
{
|
||||
QStringList devList;
|
||||
foreach (Curve cur, graph->curves()) {
|
||||
devList << cur.tag.left(cur.tag.lastIndexOf("."));
|
||||
}
|
||||
|
||||
m_pTrendTreeModel->loadTagInfoByDevTag(devList);
|
||||
|
||||
m_plotWidget->clear();
|
||||
if(!name.isEmpty())
|
||||
{
|
||||
@ -541,3 +559,27 @@ bool CTrendWindow::eventFilter(QObject *watched, QEvent *event)
|
||||
return QWidget::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
void CTrendWindow::setEnableAddNanFlag(bool bEnable)
|
||||
{
|
||||
if(m_plotWidget)
|
||||
{
|
||||
m_plotWidget->setEnableAddNanFlag(bEnable);
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendWindow::clearCustomInterval()
|
||||
{
|
||||
if(m_plotWidget)
|
||||
{
|
||||
m_plotWidget->clearCustomInterval();
|
||||
}
|
||||
}
|
||||
|
||||
void CTrendWindow::addCustomInterval(const QString &desc, const int &sec)
|
||||
{
|
||||
if(m_plotWidget)
|
||||
{
|
||||
m_plotWidget->addCustomInterval(desc,sec);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTRENDWINDOW_H
|
||||
#ifndef CTRENDWINDOW_H
|
||||
#define CTRENDWINDOW_H
|
||||
|
||||
#include <QWidget>
|
||||
@ -48,6 +48,12 @@ public slots:
|
||||
void setDevTreeVisible(bool visible);
|
||||
void setAdaptVisible(bool visible);
|
||||
void setAlarmPointVisible(bool visible);
|
||||
void setPreCurveVisible(bool visible);
|
||||
void setEnableAddNanFlag(bool bEnable); //caodingfa:定时存盘周期可变时,原有逻辑会导致每个间隔插入一个Nan值,导致无效,为不影响原逻辑,增加一个开关
|
||||
|
||||
//用于重新设置自定义界面中的周期间隔
|
||||
void clearCustomInterval();
|
||||
void addCustomInterval(const QString &desc,const int &sec);
|
||||
|
||||
void login();
|
||||
void logout();
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
QT += core gui widgets sql xml printsupport
|
||||
|
||||
|
||||
TARGET = TrendCurves
|
||||
TEMPLATE = lib
|
||||
|
||||
@ -14,6 +15,7 @@ CONFIG += plugin
|
||||
|
||||
INCLUDEPATH += $$PWD
|
||||
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/plot/qcustomplot.cpp \
|
||||
$$PWD/widgets/CTabButton.cpp \
|
||||
@ -23,6 +25,8 @@ SOURCES += \
|
||||
$$PWD/widgets/QxtSpanSlider.cpp \
|
||||
$$PWD/widgets/CSWitchButton.cpp \
|
||||
$$PWD/widgets/CSliderRangeWidget.cpp \
|
||||
$$PWD/widgets/CMyCheckBox.cpp \
|
||||
$$PWD/widgets/CMyListWidget.cpp \
|
||||
CTrendWindow.cpp \
|
||||
CTrendGraph.cpp \
|
||||
CPlotWidget.cpp \
|
||||
@ -39,11 +43,8 @@ SOURCES += \
|
||||
CTrendTreeView.cpp \
|
||||
CHisDataManage.cpp \
|
||||
CCurveLegendView.cpp \
|
||||
CMyCheckBox.cpp \
|
||||
CMyListWidget.cpp \
|
||||
CTableDataModel.cpp \
|
||||
CTableView.cpp
|
||||
# main.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/plot/qcustomplot.h \
|
||||
@ -55,6 +56,8 @@ HEADERS += \
|
||||
$$PWD/widgets/QxtSpanSlider_p.h \
|
||||
$$PWD/widgets/CSWitchButton.h \
|
||||
$$PWD/widgets/CSliderRangeWidget.h \
|
||||
$$PWD/widgets/CMyCheckBox.h \
|
||||
$$PWD/widgets/CMyListWidget.h \
|
||||
CTrendWindow.h \
|
||||
CTrendGraph.h \
|
||||
CPlotWidget.h \
|
||||
@ -71,8 +74,6 @@ HEADERS += \
|
||||
CTrendTreeView.h \
|
||||
CHisDataManage.h \
|
||||
CCurveLegendView.h \
|
||||
CMyCheckBox.h \
|
||||
CMyListWidget.h \
|
||||
CTableDataModel.h \
|
||||
CTableView.h
|
||||
|
||||
@ -83,7 +84,7 @@ FORMS += \
|
||||
LIBS += -llog4cplus -lboost_system -lprotobuf -lpub_logger_api -lmodel_excel
|
||||
LIBS += -lpub_utility_api -lpub_sysinfo_api
|
||||
LIBS += -ldb_base_api -ldb_api_ex -lrdb_api -lrdb_net_api -ltsdb_api -ldb_his_query_api
|
||||
LIBS += -lnet_msg_bus_api -lperm_mng_api -ldp_chg_data_api -lRetriever
|
||||
LIBS += -lnet_msg_bus_api -lperm_mng_api -ldp_chg_data_api -lRetriever -lpub_widget
|
||||
|
||||
include($$PWD/../../../idl_files/idl_files.pri)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include <QApplication>
|
||||
#include <QApplication>
|
||||
#include "CTrendWindow.h"
|
||||
#include "pub_logger_api/logger.h"
|
||||
#include "dp_chg_data_api/CDpcdaForApp.h"
|
||||
@ -18,7 +18,7 @@ int main(int argc, char *argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(perm->SysLogin("1", "1", 1, 12*60*60, "hmi") != 0)
|
||||
if(perm->SysLogin("admin", "admin", 1, 12*60*60, "hmi") != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/***************************************************************************
|
||||
/***************************************************************************
|
||||
** **
|
||||
** QCustomPlot, an easy to use, modern plotting widget for Qt **
|
||||
** Copyright (C) 2011-2017 Emanuel Eichhammer **
|
||||
@ -6062,16 +6062,23 @@ QString QCPAxisTickerDateTime::getTickLabel(double tick, const QLocale &locale,
|
||||
QVector<double> QCPAxisTickerDateTime::createTickVector(double tickStep, const QCPRange &range)
|
||||
{
|
||||
QVector<double> result = QCPAxisTicker::createTickVector(tickStep, range);
|
||||
|
||||
if (!result.isEmpty())
|
||||
{
|
||||
if (mDateStrategy == dsUniformTimeInDay)
|
||||
{
|
||||
QDateTime uniformDateTime = keyToDateTime(mTickOrigin); // the time of this datetime will be set for all other ticks, if possible
|
||||
QDateTime tickDateTime;
|
||||
int nOffsetToUTC = 0 - uniformDateTime.offsetFromUtc();
|
||||
for (int i=0; i<result.size(); ++i)
|
||||
{
|
||||
tickDateTime = keyToDateTime(result.at(i));
|
||||
tickDateTime.setTime(uniformDateTime.time());
|
||||
|
||||
if(i != 0 && i != result.size() - 1)
|
||||
{
|
||||
tickDateTime = tickDateTime.addSecs(nOffsetToUTC);
|
||||
}
|
||||
result[i] = dateTimeToKey(tickDateTime);
|
||||
}
|
||||
} else if (mDateStrategy == dsUniformDayInMonth)
|
||||
@ -6090,8 +6097,17 @@ QVector<double> QCPAxisTickerDateTime::createTickVector(double tickStep, const Q
|
||||
tickDateTime.setDate(QDate(tickDateTime.date().year(), tickDateTime.date().month(), thisUniformDay));
|
||||
result[i] = dateTimeToKey(tickDateTime);
|
||||
}
|
||||
} else if(tickStep >= 43200000)
|
||||
{
|
||||
QDateTime curTime = QDateTime::currentDateTime();
|
||||
int nOffset = curTime.offsetFromUtc() * 1000;
|
||||
for(int i = 1; i < result.size() - 1;++i)
|
||||
{
|
||||
result[i] = result[i] - nOffset;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -10732,6 +10748,11 @@ void QCPAbstractPlottable::setDesc(const QString &desc)
|
||||
mDesc = desc;
|
||||
}
|
||||
|
||||
void QCPAbstractPlottable::setType(const int &type)
|
||||
{
|
||||
mType = type;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets whether fills of this plottable are drawn antialiased or not.
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/***************************************************************************
|
||||
/***************************************************************************
|
||||
** **
|
||||
** QCustomPlot, an easy to use, modern plotting widget for Qt **
|
||||
** Copyright (C) 2011-2017 Emanuel Eichhammer **
|
||||
@ -3310,6 +3310,7 @@ public:
|
||||
// getters:
|
||||
QString name() const { return mName; }
|
||||
QString desc() const { return mDesc; }
|
||||
int type() const { return mType; }
|
||||
bool antialiasedFill() const { return mAntialiasedFill; }
|
||||
bool antialiasedScatters() const { return mAntialiasedScatters; }
|
||||
QPen pen() const { return mPen; }
|
||||
@ -3324,6 +3325,7 @@ public:
|
||||
// setters:
|
||||
void setName(const QString &name);
|
||||
void setDesc(const QString &desc);
|
||||
void setType(const int &type);
|
||||
void setAntialiasedFill(bool enabled);
|
||||
void setAntialiasedScatters(bool enabled);
|
||||
void setPen(const QPen &pen);
|
||||
@ -3362,6 +3364,7 @@ protected:
|
||||
// property members:
|
||||
QString mName;
|
||||
QString mDesc;
|
||||
int mType;
|
||||
bool mAntialiasedFill, mAntialiasedScatters;
|
||||
QPen mPen;
|
||||
QBrush mBrush;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CEditCollectWidget.h"
|
||||
#include "CEditCollectWidget.h"
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QLabel>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CEDITCOLLECTWIDGET_H
|
||||
#ifndef CEDITCOLLECTWIDGET_H
|
||||
#define CEDITCOLLECTWIDGET_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CMyCheckBox.h"
|
||||
#include "CMyCheckBox.h"
|
||||
#include <QMouseEvent>
|
||||
|
||||
CMyCheckBox::CMyCheckBox(QString text, QWidget *parent)
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef MYCHECKBOX_H
|
||||
#ifndef MYCHECKBOX_H
|
||||
#define MYCHECKBOX_H
|
||||
|
||||
#include <QCheckBox>
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CMyListWidget.h"
|
||||
#include "CMyListWidget.h"
|
||||
|
||||
CMyListWidget::CMyListWidget(QWidget *parent):QListWidget(parent)
|
||||
{
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CMYLISTWIDGET_H
|
||||
#ifndef CMYLISTWIDGET_H
|
||||
#define CMYLISTWIDGET_H
|
||||
|
||||
#include <QListWidget>
|
||||
@ -1,4 +1,4 @@
|
||||
#include <QPainter>
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainterPath>
|
||||
#include "CSWitchButton.h"
|
||||
@ -34,15 +34,18 @@ void CSWitchButton::paintEvent(QPaintEvent *event)
|
||||
QColor background;
|
||||
QColor handleColor;
|
||||
QString text;
|
||||
QString unSelectText;
|
||||
if (isEnabled()) { // 可用状态
|
||||
if (m_bChecked) { // 打开状态
|
||||
background = m_checkedColor;
|
||||
handleColor = m_handleColor;
|
||||
text = m_strText;
|
||||
unSelectText=m_strCheckText;
|
||||
} else { //关闭状态
|
||||
background = m_background;
|
||||
handleColor = m_handleColor;
|
||||
text = m_strCheckText;
|
||||
unSelectText=m_strText;
|
||||
}
|
||||
} else { // 不可用状态
|
||||
background = m_disabledColor;
|
||||
@ -59,6 +62,7 @@ void CSWitchButton::paintEvent(QPaintEvent *event)
|
||||
painter.drawRoundedRect(QRectF(m_nX - (m_nHeight / 2), m_nY - (m_nHeight / 2), width()/2, height()), m_radius, m_radius);
|
||||
painter.setPen(m_textColor);
|
||||
painter.drawText(QRectF(width()/2 - m_nX + (m_nHeight / 2), height()/5, width()/2, height()), text);
|
||||
painter.drawText(QRectF(m_nX, height()/5, width()/2, height()), unSelectText);
|
||||
}
|
||||
|
||||
// 鼠标按下事件
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef SWITCHBUTTON_H
|
||||
#ifndef SWITCHBUTTON_H
|
||||
#define SWITCHBUTTON_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CSliderRangeWidget.h"
|
||||
#include "CSliderRangeWidget.h"
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
#include <QSpinBox>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CSLIDERRANGEWIDGET_H
|
||||
#ifndef CSLIDERRANGEWIDGET_H
|
||||
#define CSLIDERRANGEWIDGET_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CTabButton.h"
|
||||
#include "CTabButton.h"
|
||||
#include <QPainter>
|
||||
#include "CCalendarWidget.h"
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTABBUTTON_H
|
||||
#ifndef CTABBUTTON_H
|
||||
#define CTABBUTTON_H
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "CToolTip.h"
|
||||
#include "CToolTip.h"
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QHBoxLayout>
|
||||
@ -91,7 +91,7 @@ void CToolTip::on_pushButton_clicked()
|
||||
alarmTable->setModel(model);
|
||||
alarmTable->resizeColumnsToContents();
|
||||
alarmTable->setObjectName("m_tipAlarmTable");
|
||||
alarmTable->resize(470,300);
|
||||
alarmTable->resize(800,400);
|
||||
alarmTable->setWindowFlags(alarmTable->windowFlags()&~(Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint));
|
||||
alarmTable->horizontalHeader()->setStretchLastSection(true);
|
||||
alarmTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef CTOOLTIP_H
|
||||
#ifndef CTOOLTIP_H
|
||||
#define CTOOLTIP_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "QxtSpanSlider.h"
|
||||
#include "QxtSpanSlider.h"
|
||||
/****************************************************************************
|
||||
** Copyright (c) 2006 - 2011, the LibQxt project.
|
||||
** See the Qxt AUTHORS file for a list of authors and copyright holders.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#ifndef QXTSPANSLIDER_H
|
||||
#ifndef QXTSPANSLIDER_H
|
||||
/****************************************************************************
|
||||
** Copyright (c) 2006 - 2011, the LibQxt project.
|
||||
** See the Qxt AUTHORS file for a list of authors and copyright holders.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user