Skip to content

Commit d8c2044

Browse files
author
tianmingyao
committed
update
1 parent 60d1bdd commit d8c2044

19 files changed

+480
-13
lines changed

CustomControls.pro

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,19 @@ SOURCES += \
2828
mainwindow.cpp \
2929
LEDNumber/LedNumber.cpp \
3030
Loading/Loading.cpp \
31-
RoundProgressBar/roundprogressbar.cpp
31+
RoundDot/RoundDot.cpp \
32+
RoundProgressBar/roundprogressbar.cpp \
33+
SelfAdaptableLabel/SelfAdaptableLabel.cpp
3234

3335
HEADERS += \
3436
mainwindow.h \
37+
CustomLineEdit/CustomLineEdit.h \
38+
CustomLineEdit/LineEditpart.h \
3539
LEDNumber/LedNumber.h \
3640
Loading/Loading.h \
37-
RoundProgressBar/roundprogressbar.h
41+
RoundDot/RoundDot.h \
42+
RoundProgressBar/roundprogressbar.h \
43+
SelfAdaptableLabel/SelfAdaptableLabel.h
3844

3945
FORMS += \
4046
mainwindow.ui

CustomLineEdit/CustomLineEdit.cpp

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include "CustomLineEdit.h"
2+
#include <QDebug>
3+
4+
CustomLineEdit::CustomLineEdit(QWidget *parent) : QWidget(parent)
5+
{
6+
//默认输入为6个
7+
setInputCount(6);
8+
//默认开启密码样式
9+
setPassWordMode(true);
10+
//默认显示装饰线
11+
showVerticalLine(true);
12+
13+
QHBoxLayout *layout=new QHBoxLayout(this);
14+
layout->setMargin(14);
15+
layout->setSpacing(2);
16+
this->setLayout(layout);
17+
for(int i=0;i<_inputCount;i++)
18+
{
19+
LineEditPart* part=new LineEditPart(this);
20+
//当文字内容变化时,获取内容信息,并改变聚焦
21+
connect(part,&LineEditPart::textChanged,[=]{
22+
textList[i]=part->text().simplified();
23+
if(textList[i].isEmpty())
24+
{
25+
if(i!=0)
26+
partList.at(i-1)->setFocus();
27+
}
28+
else if(i<_inputCount-1)
29+
partList.at(i+1)->setFocus();
30+
emit textChanged();
31+
});
32+
connect(part,&LineEditPart::leftAndRightPressed,[=](int a){
33+
if(a)
34+
{
35+
qDebug()<<"right";
36+
LineEditPart* part=(LineEditPart*)(this->focusWidget());
37+
int index=partList.indexOf(part);
38+
if(index<partList.length()-1)
39+
partList.at(index+1)->setFocus();
40+
}
41+
else
42+
{
43+
qDebug()<<"left";
44+
LineEditPart* part=(LineEditPart*)(this->focusWidget());
45+
int index=partList.indexOf(part);
46+
if(index)
47+
partList.at(index-1)->setFocus();
48+
}
49+
});
50+
part->setEchoMode(QLineEdit::Password);
51+
layout->addWidget(part);
52+
partList.append(part);
53+
textList.append(QString(""));
54+
55+
//最后一个回车时发送回车信号
56+
if(i==_inputCount-1)
57+
connect(part,&LineEditPart::returnPressed,[=]{
58+
emit returnPressed();
59+
});
60+
//加入装饰线
61+
else if(_verticalLine)
62+
{
63+
QFrame* line = new QFrame(this);
64+
line->setObjectName(QStringLiteral("line"));
65+
line->setStyleSheet(QStringLiteral("background-color: rgba(220,220,220,200);border-width:0px;"));
66+
line->setMinimumWidth(1);
67+
//line->setFrameShape(QFrame::VLine);
68+
//line->setFrameShadow(QFrame::Sunken);
69+
layout->addWidget(line);
70+
}
71+
}
72+
}
73+
74+
void CustomLineEdit::paintEvent(QPaintEvent* event)
75+
{
76+
QStyleOption opt;
77+
opt.init(this);
78+
QPainter p(this);
79+
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
80+
QWidget::paintEvent(event);
81+
}
82+
83+
void CustomLineEdit::setInputCount(int count)
84+
{
85+
_inputCount=count;
86+
}
87+
88+
void CustomLineEdit::setPassWordMode(bool flag)
89+
{
90+
_passwordMode=flag;
91+
}
92+
93+
void CustomLineEdit::showVerticalLine(bool flag)
94+
{
95+
_verticalLine=flag;
96+
}
97+
98+
QString CustomLineEdit::text()
99+
{
100+
QString str("");
101+
for(QString i:textList)
102+
str+=i;
103+
return str;
104+
}
105+
106+
107+
108+
109+
110+

CustomLineEdit/CustomLineEdit.h

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#ifndef CUSTOMLINEEDIT_H
2+
#define CUSTOMLINEEDIT_H
3+
4+
#include "LineEditpart.h"
5+
6+
#include <QWidget>
7+
#include <QHBoxLayout>
8+
#include <QPainter>
9+
#include <QStyleOption>
10+
#include <QFrame>
11+
#include <QKeyEvent>
12+
13+
class CustomLineEdit : public QWidget
14+
{
15+
Q_OBJECT
16+
public:
17+
explicit CustomLineEdit(QWidget *parent = nullptr);
18+
//设置几个输入
19+
void setInputCount(int);
20+
//设置是否需要密码样式
21+
void setPassWordMode(bool);
22+
//获取内容
23+
QString text();
24+
//显示装饰线
25+
void showVerticalLine(bool);
26+
private:
27+
int _inputCount;
28+
bool _passwordMode;
29+
bool _verticalLine;
30+
QVector<LineEditPart*> partList;
31+
QList<QString> textList;
32+
33+
signals:
34+
void returnPressed();
35+
void textChanged();
36+
37+
public slots:
38+
39+
protected:
40+
void paintEvent(QPaintEvent *event);
41+
};
42+
43+
#endif // CUSTOMLINEEDIT_H

CustomLineEdit/LineEditpart.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "LineEditpart.h"
2+
#include <QRegExpValidator>
3+
4+
LineEditPart::LineEditPart(QWidget *parent) : QLineEdit(parent)
5+
{
6+
this->setStyleSheet("background-color:rgba(0,0,0,0);border-width:0px;color:rgb(255,255,255);");
7+
8+
//设置只能输入一个字符
9+
QValidator* validator=new QRegExpValidator(QRegExp("^.{1}$"),this);
10+
this->setValidator(validator);
11+
this->setAlignment(Qt::AlignCenter);
12+
}
13+
14+
//按键事件
15+
void LineEditPart::keyPressEvent(QKeyEvent *event)
16+
{
17+
switch (event->key())
18+
{
19+
case Qt::Key_Left:
20+
emit leftAndRightPressed(0);
21+
break;
22+
case Qt::Key_Right:
23+
emit leftAndRightPressed(1);
24+
break;
25+
case Qt::Key_Up:
26+
emit leftAndRightPressed(0);
27+
break;
28+
case Qt::Key_Down:
29+
emit leftAndRightPressed(1);
30+
break;
31+
default:
32+
break;
33+
}
34+
QLineEdit::keyPressEvent(event);
35+
return;
36+
}
37+
38+

CustomLineEdit/LineEditpart.h

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef LINEEDITPART_H
2+
#define LINEEDITPART_H
3+
4+
#include <QKeyEvent>
5+
#include <QLineEdit>
6+
7+
class LineEditPart : public QLineEdit
8+
{
9+
Q_OBJECT
10+
public:
11+
explicit LineEditPart(QWidget *parent = nullptr);
12+
13+
signals:
14+
//0 for left 1 for right
15+
void leftAndRightPressed(int);
16+
public slots:
17+
protected:
18+
void keyPressEvent(QKeyEvent *event) override;
19+
};
20+
21+
#endif // LINEEDITPART_H

LEDNumber/LedNumber.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,20 @@ void LEDNumber::setFontSize(int size)
5656
}
5757

5858
//********************************************** 绘制部分 ****************************************
59+
void LEDNumber::resizeEvent(QResizeEvent *event)
60+
{
61+
//计算绘制区域
62+
caculateArea();
63+
}
64+
5965
void LEDNumber::paintEvent(QPaintEvent *event)
6066
{
6167
Q_UNUSED(event)
6268
QPainter painter(this);
6369
painter.setRenderHint(QPainter::Antialiasing);
6470

6571
//计算绘制区域
66-
caculateArea();
72+
// caculateArea();
6773
//绘制背景
6874
drawBack(painter);
6975
//绘制文字

LEDNumber/LedNumber.h

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class LEDNumber : public QWidget
5151

5252
protected:
5353
void paintEvent(QPaintEvent *event);
54+
void resizeEvent(QResizeEvent *event);
5455

5556
signals:
5657

Loading/Loading.cpp

+85-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
#include "Loading.h"
2+
#include "qmath.h"
3+
#include <QDebug>
24

3-
Loading::Loading(QWidget *parent) : QWidget(parent)
5+
Loading::Loading(QWidget *parent) : QWidget(parent),_i(0),_interval(50),_index(0)
46
{
5-
setDotColor(QColor(100,100,100));
7+
//设置背景透明
8+
//this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
9+
//this->setAttribute(Qt::WA_TranslucentBackground, true);
10+
11+
setDotColor(QColor(49, 177, 190));
12+
setDotCount(20);
13+
connect(&timer,&QTimer::timeout,this,&Loading::refresh);
14+
setMaxDiameter(30);
15+
setMinDiameter(5);
616
}
717

818
//********************************************** 设置部分 *************************************
919
//设置点的个数
1020
void Loading::setDotCount(int count)
1121
{
12-
22+
_count=count;
1323
}
1424

1525
//设置点的颜色
@@ -18,16 +28,88 @@ void Loading::setDotColor(const QColor & color)
1828
_dotColor=color;
1929
}
2030

31+
//开始动画
32+
void Loading::start()
33+
{
34+
timer.setInterval(_interval);
35+
timer.start();
36+
}
37+
38+
//设置最大直径
39+
void Loading::setMaxDiameter(float max)
40+
{
41+
_maxDiameter=max;
42+
}
43+
44+
//设置最小直径
45+
void Loading::setMinDiameter(float min)
46+
{
47+
_minDiameter=min;
48+
}
2149
//********************************************** 绘制部分 *************************************
50+
//刷新界面
51+
void Loading::refresh()
52+
{
53+
repaint();
54+
}
55+
56+
void Loading::resizeEvent(QResizeEvent *event)
57+
{
58+
Q_UNUSED(event)
59+
caculate();
60+
}
61+
2262
void Loading::paintEvent(QPaintEvent *event)
2363
{
64+
Q_UNUSED(event)
2465
QPainter painter(this);
2566
painter.setRenderHint(QPainter::Antialiasing);
2667

68+
painter.setPen(_dotColor);
69+
painter.setBrush(_dotColor);
70+
71+
//绘制点
2772
paintDot(painter);
2873
}
2974

75+
//计算绘制正方形区域
76+
void Loading::caculate()
77+
{
78+
_squareWidth=qMin(this->width(),this->height());
79+
float half=_squareWidth/2;
80+
_centerDistance=half-_maxDiameter/2-1;
81+
82+
float gap=(_maxDiameter-_minDiameter)/(_count-1)/2;
83+
float angleGap=(float)360/_count;
84+
85+
locationList.clear();
86+
radiiList.clear();
87+
88+
for(int i=0;i<_count;i++)
89+
{
90+
radiiList<<_maxDiameter/2-i*gap;
91+
float radian=qDegreesToRadians(-angleGap*i);
92+
locationList.append(Location(half+_centerDistance*qCos(radian),half-_centerDistance*qSin(radian)));
93+
}
94+
}
95+
96+
//绘制圆点
3097
void Loading::paintDot(QPainter& painter)
3198
{
99+
for(int i=0;i<_count;i++)
100+
{
101+
painter.setPen(_dotColor);
102+
//半径
103+
float radii=radiiList.at((_index+_count-i)%_count);
32104

105+
//绘制圆点
106+
painter.drawEllipse(QPointF(locationList.at(i).x,locationList.at(i).y),radii,radii);
107+
//绘制正方形
108+
//painter.drawRect(locationList.at(i).x,locationList.at(i).y,radii,radii);
109+
//绘制文字
110+
//QFont font("Microsoft YaHei",radii*1.2,75);
111+
//painter.setFont(font);
112+
//painter.drawText(QPointF(locationList.at(i).x,locationList.at(i).y),u8"霞");
113+
}
114+
_index++;
33115
}

0 commit comments

Comments
 (0)