#include "switch.h" Switch::Switch(QWidget *parent) : QWidget(parent) { setMinimumSize(QSize(1, 1)); resize(20, 40); } Switch::~Switch() { } int16_t Switch::Limit(int16_t pos, int16_t min, int16_t max) { return ( pos <= min)?(min):((pos >= max)?(max):(pos)); } void Switch::setRecovery(bool state) { Recovery = state; update(); } void Switch::setSwitchdir(uint8_t value) { if(value == 0x00) { resize(this->width(), this->height()); } else { resize(this->height(), this->width()); } m_switchdir = value; update(); } void Switch::setNotice(uint16_t pos,QString str) { Notice.insert(pos,str); } void Switch::setSegment(uint16_t value) { float size_step = 0; size_step = (float)size().height() / m_segment; resize(size().width(),value * size_step); //qDebug() << value << size(); m_segment = value; update(); } void Switch::setPosition(uint16_t pos) { m_position = Limit(pos,0,m_segment-1); update(); } void Switch::setValue(uint16_t value) { m_channel = Limit(value,m_min,m_max); //m_position = (float)(m_channel - m_min) * (m_segment - 1) / (m_max - m_min); //qDebug() << (m_max - m_min)/m_segment; for(int i = 1;i<=m_segment;i++) { if(i<(m_segment)) { if((m_channel - m_min) <= (((m_max - m_min)/m_segment)*i)) { m_position = i-1; break; } } else { if((m_channel - m_min) > (((m_max - m_min)/m_segment)*i)) { m_position = i-1; break; } } } update(); } uint16_t Switch::segment(void) { return m_segment; } uint16_t Switch::position(void) { return m_position; } uint16_t Switch::channel(void) { return m_channel; } void Switch::mouseReleaseEvent(QMouseEvent *e) { Q_UNUSED(e); if(Recovery == true) { m_position = m_segment/2; } update(); } void Switch::mousePressEvent(QMouseEvent *e) { if(m_switchdir == 0) { m_position = Limit((e->y() / (this->height()/m_segment)),0,m_segment -1 ); } else { m_position = Limit((e->x() / (this->width()/m_segment)),0,m_segment -1 ); } m_channel = m_min + (float)(m_position)/(m_segment - 1) * (m_max - m_min); //qDebug() << m_channel << m_position; emit positionChange(m_channel); update(); } void Switch::mouseMoveEvent(QMouseEvent *e) { if(m_switchdir == 0) { m_position = Limit((e->y() / (this->height()/m_segment)),0,m_segment -1 ); } else { m_position = Limit((e->x() / (this->width()/m_segment)),0,m_segment -1 ); } m_channel = m_min + (float)(m_position)/(m_segment - 1) * (m_max - m_min); emit positionChange(m_channel); update(); } void Switch::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */ painter.translate(width() / 2, height() / 2); /* 坐标变换为窗体中心 */ //int side = qMin(width(), height()); if(m_switchdir == 0) { painter.scale(width() / 500.0, height() / 1000.0); /* 比例缩放 */ } else { painter.scale(width() / 1000.0, height() / 500.0); /* 比例缩放 */ } painter.setPen(Qt::NoPen); drawSwitch(&painter); } void Switch::drawSwitch(QPainter *painter) { if(m_switchdir == 0) { painter->save(); painter->setBrush(QColor("#454545")); painter->drawRect(-250,-500,500,1000); painter->restore(); painter->save(); painter->setBrush(QColor("#5F9EA0")); painter->drawRect(-250,-500 + 1000/m_segment * m_position,500,1000/m_segment); painter->restore(); painter->save(); QPen pen; pen.setColor(QColor("#FFFFFF")); pen.setWidth(20); QFont font; font.setPixelSize(150); painter->setFont(font); painter->setPen(pen); for(int i = 1;idrawLine(-250,-500 + 1000/m_segment * i,250,-500 + 1000/m_segment * i); } for (int i = 0;idrawText(QRect(-250,-500 + 1000/m_segment * i,500,1000/m_segment),Qt::AlignVCenter|Qt::AlignHCenter,Notice.value(i)); } } painter->restore(); } else { painter->save(); painter->setBrush(QColor("#454545")); painter->drawRect(-500,-250,1000,500); painter->restore(); painter->save(); painter->setBrush(QColor("#5F9EA0")); painter->drawRect(-500 + 1000/m_segment * m_position,-250,1000/m_segment,500); painter->restore(); painter->save(); QPen pen; pen.setColor(QColor("#FFFFFF")); pen.setWidth(20); QFont font; font.setPixelSize(150); painter->setFont(font); painter->setPen(pen); for(int i = 1;idrawLine(-500 + 1000/m_segment * i,-250,-500 + 1000/m_segment * i,250); } for (int i = 0;idrawText(QRect(-500 + 1000/m_segment * i,-250,1000/m_segment,500),Qt::AlignVCenter|Qt::AlignHCenter,Notice.value(i)); } } painter->restore(); } }