#include "StateWidget.h" StateWidget::StateWidget(int flag,int index, bool is_use_line, QWidget *parent) : _is_use_line(is_use_line), 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 + 3); //表示数值的那条线 if(_is_use_line) { value_line.setParent(this); value_line.setStyleSheet("background-color: #01BBFF;"); value_line.resize(0, 2); value_line.move(0, label->height() - 2); gridlayout->addWidget(&value_line, 2, 1); } } StateWidget::StateWidget(int flag, QString t,QVariant v,state s,int index,bool is_use_line, QWidget *parent) : _is_use_line(is_use_line), 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 + 3); //表示数值的那条线 if(_is_use_line) { qDebug() << u8"使用线"; value_line.setParent(this); value_line.setStyleSheet("background-color: #01BBFF;"); value_line.resize(0, 2); value_line.move(0, label->height() - 2); gridlayout->addWidget(&value_line, 2, 1); } } 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::setLineValue(double value) { value_line.resize(0, 0); double percent = value / m_max; percent = qAbs(percent); //qDebug() << "value: " << value; //qDebug() << "m_max: " << m_max; //qDebug() << "percent: " << percent; value_line.resize(label->width() / 2 * percent, 5); //设置线的宽度 //qDebug() << u8"线的宽度:" << value_line.width(); if(value > 0) { value_line.move(label->pos().x() + label->width() / 2, label->pos().y() + label->height()); } else { value_line.move(label->pos().x() + label->width() / 2 - value_line.width(), label->pos().y() + label->height()); } } 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); QStringList str_list = s.split('|'); if(_is_use_line) { setLineValue(str_list[1].toDouble() ); //设置线的长度 } } //设置颜色会造成死机 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) { this->m_min = m_min; this->m_max = m_max; if(bar) { bar->setRange(min,max); } } void StateWidget::setStats(QMap l) { stateMap = l; }