1
#include "networkindicator.h"
2
#include "smoothcurvegenerator.h"
11
NetworkIndicator::NetworkIndicator(QWidget *parent)
16
,m_rectTotalHeight(38)
18
,m_outsideBorderColor(Qt::transparent)
19
,m_bgColor(QColor("#ffffff"))
21
this->setFixedSize(188, 56);
25
m_pointsCount = int((this->width() -2) / m_pointSpace);
26
m_downloadSpeedList = new QList<long>();
27
for (int i = 0; i < m_pointsCount; i++) {
28
m_downloadSpeedList->append(0);
31
m_uploadSpeedList = new QList<long>();
32
for (int i = 0; i < m_pointsCount; i++) {
33
m_uploadSpeedList->append(0);
36
m_gridY = new QList<int>();
38
setNetworkState(Normal);
41
NetworkIndicator::~NetworkIndicator()
43
delete m_downloadSpeedList;
44
delete m_uploadSpeedList;
48
void NetworkIndicator::enterEvent(QEvent *event)
50
setCursor(Qt::PointingHandCursor);
53
setNetworkState(Hover);
57
//QWidget::enterEvent(event);
60
void NetworkIndicator::leaveEvent(QEvent *event)
63
setNetworkState(Normal);
67
//QWidget::leaveEvent(event);
70
void NetworkIndicator::mousePressEvent(QMouseEvent *event)
72
if (event->button() != Qt::LeftButton)
75
setNetworkState(Press);
78
//QWidget::mousePressEvent(event);
81
void NetworkIndicator::mouseReleaseEvent(QMouseEvent *event)
83
if (!rect().contains(event->pos()))
86
m_isChecked = !m_isChecked;
88
setNetworkState(Checked);
90
setNetworkState(Normal);
94
//QWidget::mouseReleaseEvent(event);
96
if (event->button() == Qt::LeftButton)
100
void NetworkIndicator::mouseMoveEvent(QMouseEvent *event)
102
if (!rect().contains(event->pos())) {
103
setNetworkState(Normal);
107
void NetworkIndicator::updateBgColor()
111
this->m_outsideBorderColor = Qt::transparent;
112
this->m_bgColor = QColor("#f6fcfe");
115
this->m_outsideBorderColor = Qt::transparent;
116
this->m_bgColor = QColor("#f6fcfe");
119
this->m_outsideBorderColor = QColor("#009944");
120
this->m_bgColor = QColor("#e9f8fd");
123
this->m_outsideBorderColor = Qt::transparent;
124
this->m_bgColor = QColor("#ffffff");
130
void NetworkIndicator::setNetworkState(NetworkIndicator::NetworkState state)
132
if (m_state == state)
139
void NetworkIndicator::setChecked(bool flag)
143
setNetworkState(Checked);
145
setNetworkState(Normal);
149
bool NetworkIndicator::isChecked()
154
void NetworkIndicator::setTitle(const QString &title)
156
this->m_title = title;
159
//void NetworkIndicator::updateNetworkPainterPath(QPainterPath downloadPath, QPainterPath uploadPath)
161
// this->m_downloadPath = downloadPath;
162
// this->m_uploadPath = uploadPath;
166
NetworkIndicator::NetworkState NetworkIndicator::getNetworkState() const
171
void NetworkIndicator::onUpdateNetworkStatus(long recvTotalBytes, long sentTotalBytes, long recvRateBytes, long sentRateBytes)
173
m_recvTotalBytes = recvTotalBytes;
174
m_sentTotalBytes = sentTotalBytes;
175
m_recvRateBytes = recvRateBytes;
176
m_sentRateBytes = sentRateBytes;
179
QList<QPointF> downloadPoints;
180
m_downloadSpeedList->append(m_recvRateBytes);
181
if (m_downloadSpeedList->size() > m_pointsCount) {
182
m_downloadSpeedList->pop_front();
185
long downloadMaxHeight = 0;
186
for (int i = 0; i < m_downloadSpeedList->size(); i++) {
187
if (m_downloadSpeedList->at(i) > downloadMaxHeight) {
188
downloadMaxHeight = m_downloadSpeedList->at(i);
191
for (int i = 0; i < m_downloadSpeedList->size(); i++) {
192
if (downloadMaxHeight < m_netMaxHeight) {
193
downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i)));
196
downloadPoints.append(QPointF(i * m_pointSpace, m_downloadSpeedList->at(i) * m_netMaxHeight / downloadMaxHeight));
199
m_downloadPath = SmoothCurveGenerator::generateSmoothCurve(downloadPoints);
202
QList<QPointF> uploadPoints;
203
m_uploadSpeedList->append(m_sentRateBytes);
204
if (m_uploadSpeedList->size() > m_pointsCount) {
205
m_uploadSpeedList->pop_front();
208
long uploadMaxHeight = 0;
209
for (int i = 0; i < m_uploadSpeedList->size(); i++) {
210
if (m_uploadSpeedList->at(i) > uploadMaxHeight) {
211
uploadMaxHeight = m_uploadSpeedList->at(i);
215
for (int i = 0; i < m_uploadSpeedList->size(); i++) {
216
if (uploadMaxHeight < m_netMaxHeight) {
217
uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i)));
220
uploadPoints.append(QPointF(i * m_pointSpace, m_uploadSpeedList->at(i) * m_netMaxHeight / uploadMaxHeight));
223
m_uploadPath = SmoothCurveGenerator::generateSmoothCurve(uploadPoints);
228
void NetworkIndicator::paintEvent(QPaintEvent *event)
230
QPainter painter(this);
231
painter.setRenderHint(QPainter::Antialiasing, true);
234
QPainterPath borderPath;
235
borderPath.addRoundedRect(this->rect(), 0, 0);
236
QPen pen(this->m_outsideBorderColor, 1);
238
painter.drawPath(borderPath);
241
painter.setOpacity(1);
243
path.addRect(QRectF(1, 1, width()-2, height()-2));
244
painter.fillPath(path, this->m_bgColor);
246
painter.translate((rect().width() - m_pointsCount * m_pointSpace) / 2 + 2, 40);//将坐标第原点移动到该点
247
painter.scale(1, -1);//将横坐标扩大1倍,将纵坐标缩小1倍
248
//使用QPainterPath画贝塞尔曲线
249
painter.setPen(QPen(QColor("#009944"), 1));
250
painter.setBrush(QBrush());
251
painter.drawPath(m_downloadPath);//绘制前面创建的path:m_downloadPath
252
painter.translate(0, -8);//将点(0,-8)设为原点
253
painter.setPen(QPen(QColor("#e60012"), 1));
254
painter.setBrush(QBrush());
255
painter.drawPath(m_uploadPath);
257
QWidget::paintEvent(event);