1 #include "switchwidget.h"
2 #include <QPainter>
3 #include<QPen>
4 #include <QMouseEvent>
5 #include <QDebug>
6
SwitchWidget(QWidget * parent)7 SwitchWidget::SwitchWidget(QWidget *parent) : QWidget(parent),m_bOpen(false),
8 m_ratio(0.7)
9 {
10 this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
11 }
12
setText(const QString & title)13 void SwitchWidget::setText(const QString &title)
14 {
15 m_text = title;
16 }
17
text()18 QString SwitchWidget::text()
19 {
20 return m_text;
21 }
22
isOpen()23 bool SwitchWidget::isOpen()
24 {
25 return m_bOpen;
26 }
27
setTextRatio(qreal ratio)28 void SwitchWidget::setTextRatio(qreal ratio)
29 {
30 if(ratio< 0.5)
31 {
32 m_ratio =0.5;
33 }
34 if(ratio >0.8)
35 {
36 m_ratio= 0.8;
37 }
38 }
39
setOpen(bool bOpen)40 void SwitchWidget::setOpen(bool bOpen)
41 {
42 m_bOpen =bOpen;
43 this->update();
44 click(bOpen);
45 }
46
paintEvent(QPaintEvent * e)47 void SwitchWidget::paintEvent(QPaintEvent *e)
48 {
49 QPainter painter(this);
50 painter.setRenderHint(QPainter::Antialiasing);
51 QRectF visualRect = this->rect().adjusted(1, 1, -1, -1);
52 qreal textWidth = visualRect.width()*m_ratio;
53 qreal textHeight = visualRect.height();
54
55 QRectF tectRect = QRectF(visualRect.x(), visualRect.y(), textWidth, textHeight);
56 QTextOption option( Qt::AlignVCenter);
57 QRectF fixTextRect = painter.boundingRect(tectRect, m_text,option);
58 painter.drawText(fixTextRect, m_text);
59
60 QRectF switchRect(visualRect.x() + textWidth,
61 visualRect.y(),
62 visualRect.width()-textWidth,
63 visualRect.height());
64
65 m_rect = switchRect;
66 m_bOpen? painter.setBrush(Qt::blue) : painter.setBrush(Qt::gray);
67 painter.setPen(Qt::transparent);
68
69 int radius = switchRect.height()/2;
70 painter.drawRoundedRect(switchRect, radius, radius);
71
72 QPoint center(switchRect.x() +radius,
73 switchRect.y() +radius);
74
75 if(m_bOpen)
76 {
77 center.setX(switchRect.x() +switchRect.width()-radius);
78 }
79 painter.setBrush(Qt::white);
80 painter.drawEllipse(center,
81 visualRect.height()/2 -radius/6,
82 visualRect.height()/2 -radius/6);
83 }
84
mousePressEvent(QMouseEvent * e)85 void SwitchWidget::mousePressEvent(QMouseEvent *e)
86 {
87 QWidget::mousePressEvent(e);
88 if(m_rect.contains(e->pos()))
89 {
90 m_bOpen = !m_bOpen;
91 this->update();
92 emit click(m_bOpen);
93 qDebug()<<"click ="<< m_bOpen;
94 }else{
95 qDebug()<<"not button rect";
96 }
97 }
98
sizeHint() const99 QSize SwitchWidget::sizeHint() const
100 {
101 return QSize(160, 25);
102 }
103