#include "StateWidget.h" StateWidget::StateWidget(int flag,int index,QWidget *parent) : QWidget(parent) { this->setMouseTracking(true); gridlayout = new QGridLayout(this); gridlayout->setMargin(0); gridlayout->setVerticalSpacing(6); title = new QLabel("new status"); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); title->setFont(font); title->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); title->setFixedSize(w/2,h+m_offset); gridlayout->addWidget(title,0,0,1,1); if(flag != 1) { label = new QLabel("0"); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); label->setFont(font); label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); label->setFixedSize(w/2,h+m_offset); setColor(state::gray); gridlayout->addWidget(label,0,1,1,1); } else if(flag == 1) { bar = new QProgressBar(); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); bar->setFont(font); bar->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); bar->setRange(0,100); bar->setValue(0); bar->setFixedSize(w/2,h+m_offset); gridlayout->addWidget(bar,0,1,1,1); } type = flag; this->setLayout(gridlayout); this->resize(w,h+ 2 * m_offset); } StateWidget::StateWidget(int flag, QString t,QVariant v,state s,int index, QWidget *parent) : QWidget(parent) { this->setMouseTracking(true); id = index; gridlayout = new QGridLayout(this); gridlayout->setMargin(0); gridlayout->setVerticalSpacing(6); title = new QLabel(t); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); title->setFont(font); title->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); title->setFixedSize(w/2,h+m_offset); gridlayout->addWidget(title,0,0,1,1); if(flag != 1) { label = new QLabel(v.toString()); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); label->setFont(font); label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); label->setFixedSize(w/2,h+m_offset); setColor(s); gridlayout->addWidget(label,0,1,1,1); } else if(flag == 1) { bar = new QProgressBar(); QFont font; font.setFamily("Arial"); font.setBold(false); font.setPixelSize(20); bar->setFont(font); bar->setFormat("%v"); bar->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); bar->setRange(0,100); bar->setValue(v.toDouble()); bar->setFixedSize(w/2,h+m_offset); gridlayout->addWidget(bar,0,1,1,1); } type = flag; this->setLayout(gridlayout); this->resize(w,h + 2 * m_offset); } StateWidget::~StateWidget() { if(title) { delete title; } if(label) { delete label; } if(bar) { delete bar; } if(gridlayout) { delete gridlayout; } } void StateWidget::mousePressEvent(QMouseEvent *event) { Q_UNUSED(event) } void StateWidget::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event) } void StateWidget::mouseMoveEvent(QMouseEvent *event) { Q_UNUSED(event) } void StateWidget::enterEvent(QEvent * event) { Q_UNUSED(event) this->resize(this->size().width() + 6,this->height() + 6); if(title) { QFont font = title->font(); font.setBold(true); font.setPixelSize(23); title->setFont(font); } if(label) { QFont font = label->font(); font.setBold(true); font.setPixelSize(23); label->setFont(font); } if(bar) { QFont font = bar->font(); font.setBold(true); font.setPixelSize(23); bar->setFont(font); } } void StateWidget::leaveEvent(QEvent *event) { this->resize(this->size().width() - 6,this->height() - 6); if(title) { QFont font = title->font(); font.setBold(false); font.setPixelSize(20); title->setFont(font); } if(label) { QFont font = label->font(); font.setBold(false); font.setPixelSize(20); label->setFont(font); } if(bar) { QFont font = bar->font(); font.setBold(false); font.setPixelSize(20); bar->setFont(font); } } void StateWidget::setColor(state s) { if(label) { label->setProperty("state",s); label->style()->unpolish(label); label->style()->polish(label); } if(bar) { bar->setProperty("state",s); bar->style()->unpolish(bar); bar->style()->polish(bar); } } void StateWidget::setValue(QString s) { if(label) { label->setText(s); } //设置颜色会造成死机 bool flag = false; double num = s.toDouble(&flag); double value = (qIsNaN(num))?(0):(num); //qDebug() << "num" << num << "value" << value; /* if(bar) { if(value > bar->maximum()) { bar->setRange(min,value); } else if(value > bar->minimum()) { bar->setRange(value,max); } else { bar->setRange(min,max); } bar->setValue(value); } */ if(flag)//number { double last = min; for (QMap::iterator i = stateMap.begin(); i != stateMap.end(); ++i) { if(i == stateMap.begin()) { if(value < i.key().toDouble()) { setColor(state::red); break; } } else { if((value >= last) &&(value <= i.key().toDouble())) { setColor(i.value()); break; } } last = i.key().toDouble(); if((i+1) == stateMap.end())//overflow is red { if(value > last) { setColor(state::red); break; } } } } else //not a number { if(s.contains('|')) { QStringList list = s.split('|'); bool isNum = false; qreal last = 0; bool isDiff = false; foreach (QString ss, list) { bool nflag = false; qreal nn = ss.toDouble(&nflag); isNum = nflag; if(nflag) { if(!stateMap.isEmpty()) { bool flag_key = false; qreal limit = stateMap.begin().key().toDouble(&flag_key); if(flag_key) { isDiff = (qAbs(nn - last) > limit)?(true):(false); } else { isDiff = (qAbs(nn - last) > 1.0)?(true):(false); } } else { isDiff = (qAbs(nn - last) > 1.0)?(true):(false); } } last = nn; } if(isNum) { if(isDiff) { setColor(state::red); } else { setColor(state::green); } } else { if(stateMap.keys().contains(s)) { setColor(stateMap.value(s)); } else { setColor(state::gray); } } } else { if(stateMap.keys().contains(s)) { setColor(stateMap.value(s)); } else { setColor(state::gray); } } } } void StateWidget::setRange(double m_min,double m_max) { min = m_min; max = m_max; if(bar) { bar->setRange(min,max); } } void StateWidget::setStats(QMap l) { stateMap = l; }