#include "rollswitchwidget.h" #include #include #include #include #include RollSwitchWidget::RollSwitchWidget(QWidget *parent) : QWidget(parent), m_text("SERIAL %1"), m_index(0), m_count(3) { } void RollSwitchWidget::setCount(int count) { m_count = count; } int RollSwitchWidget::currentIndex() { return m_index; } QPoint getPoint(int r, int angle) { int x1 = r * qCos(angle * M_PI / 180); int y1 = r * qSin(angle * M_PI /180); return QPoint(x1, y1); } void RollSwitchWidget::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing); QMargins margins = contentsMargins(); QFont f = this->font(); f.setPointSizeF(f.pointSizeF()+1); f.setBold(true); painter.setFont(f); QRect rect = this->rect().adjusted(margins.left(), margins.top(), - margins.bottom(), -margins.right()); int textX = rect.width()/3; int textY = rect.y(); QString text = QString(m_text).arg(m_index+1); QRectF textRect(textX, textY, textX, rect.height()); QTextOption option(Qt::AlignCenter); QRectF fixRect = painter.boundingRect(textRect, text, option); painter.save(); //painter.setPen(QColor(141, 141, 141)); painter.setPen(QColor(56, 56, 56)); painter.drawText(fixRect, text); painter.restore(); m_leftRect= QRect(rect.x(), rect.y(), textX, rect.height()); m_rightRect = QRect(rect.x() +textX*2, rect.y(), textX, rect.height()); int r = m_leftRect.height()/2; QPointF center(m_leftRect.x()+ m_leftRect.width()/2, m_leftRect.y() +m_leftRect.height()/2); QPen pen(Qt::gray); pen.setWidthF(2.5); painter.save(); QPalette palette = this->palette(); palette.setCurrentColorGroup(QPalette::Disabled); // if(currentIndex() == 0) // { // pen.setColor(palette.color(QPalette::Text)); // } painter.setPen(pen); painter.translate(center); painter.drawLine(QPointF(0,0), getPoint(m_leftRect, 30)); painter.drawLine(QPointF(0,0), getPoint(m_leftRect, -30)); painter.restore(); center = QPointF(m_rightRect.x() + m_rightRect.width()/2, m_rightRect.y() + m_rightRect.height()/2); painter.save(); pen.setColor(Qt::gray); // if(currentIndex() == m_count-1) // { // pen.setColor(palette.color(QPalette::Text)); // } painter.setPen(pen); painter.translate(center); painter.drawLine(QPointF(0,0), getPoint(m_rightRect, 150)); painter.drawLine(QPointF(0,0), getPoint(m_rightRect, -150)); painter.restore(); } void RollSwitchWidget::mousePressEvent(QMouseEvent *e) { if(m_leftRect.contains(e->pos())) { m_index --; }else if(m_rightRect.contains(e->pos())) { m_index ++; } if(m_index <0) { m_index =2; }if(m_index >= m_count) { m_index =0; } this->update(); emit indexChange(m_index); } QPointF RollSwitchWidget::getPoint(const QRect &rect, int angle) { int r = rect.width()/2; if(rect.width() >rect.height()) { r = rect.height()/2; } int x1 = r * qCos(angle * M_PI / 180); int y1 = r * qSin(angle * M_PI /180); return QPointF(x1, y1); }