山前大桥下,有一个傻瓜。一枚小学生,幽居荒山中。养了一群狗,还有一只猫。喜欢搞编程,缺钱打零工。数理史皆通,法文记心中。下厨会做饭,挥毫能舞文。
老规矩,先上图
平滑动画尚未做,后期完善。主要代码如下
头文件主要代码:
protected:
/// 初始化文字罗盘时钟
/// \brief InitTextClockCtl
///
void InitTextClockCtl();
/// 系统绘制事件
/// \brief paintEvent
///
void paintEvent(QPaintEvent *);
/// 绘制背景
/// \brief DrawsBackgrounds
/// \param painter
///
void DrawsBackgrounds(QPainter *painter);
/// 绘制刻度
/// \brief DrawAnglesValues
/// \param painter
///
void DrawAnglesValues(QPainter *painter);
/// 绘制时间线
/// \brief DrawTimeLineItem
/// \param painter
///
void DrawTimeLineItem(QPainter *painter);
/// 绘制中心年份
/// \brief DrawCentersItems
/// \param painter
/// \param date
///
void DrawCentersItems(QPainter *painter,const QDate date);
/// 绘制月份
/// \brief DrawMonthPointer
/// \param painter
/// \param date
///
void DrawMonthPointer(QPainter *painter,const QDate date);
/// 绘制日期
/// \brief DrawDaysPointers
/// \param painter
/// \param date
///
void DrawDaysPointers(QPainter *painter,const QDate date);
/// 绘制时针数据
/// \brief DrawHourPointers
/// \param painter
/// \param time
///
void DrawHourPointers(QPainter *painter,const QTime time);
/// 绘制分针数据
/// \brief DrawMinutPointer
/// \param painter
/// \param time
///
void DrawMinutPointer(QPainter *painter,const QTime time);
/// 绘制秒针数据
/// \brief DrawSecsPointers
/// \param painter
/// \param time
///
void DrawSecsPointers(QPainter *painter,const QTime time);
private:
LNCFQTEXTCLOCK_DATAS tDashboardData; //时钟控件数据结构变量
Lncf_LunarCalendarInfo tLunarCalendar; //农历信息变量
LNCFQT_LUNARCAL_INFO tLunarDateInfo; //当前日农历信息
QTimer *pTextColckTime = nullptr;
QFont pClockTextFont; //文字字体
QList<std::u16string> sMonthTextList; //月份字符串列表,长度为12
QList<std::u16string> sDaysTextsList; //日期字符串列表,长度为31
QList<std::u16string> sHourTextsList; //时针字符串列表,长度为24
QList<std::u16string> sMinuteTxtList; //分针字符串列表,长度为60
QList<std::u16string> sSecondTxtList; //秒针字符串列表,长度为60
QList<std::u16string> sLunarHourText; //农历时针字符串列表,长度为12
QList<std::u16string> sLunarMinutTxt; //农历时刻字符串列表,长度为8
QDate pCurrentsDates; //当前日期索引
private:
主要绘制源代码:
/// 系统绘制事件
/// \brief paintEvent
///
void Lncf_QtTextClocked::paintEvent(QPaintEvent *event)
{
int width = this->width();
int height = this->height();
int side = qMin(width, height);
//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.translate(width / 2, height / 2);
painter.scale(side / 200.0, side / 200.0);
//绘制背景
if(this->tDashboardData.bHasShowBkgClr)
DrawsBackgrounds(&painter);
//绘制刻度
if(this->tDashboardData.bShowAngleItem)
DrawAnglesValues(&painter);
//绘制时间线
if(this->tDashboardData.bShowsTimeLine)
DrawTimeLineItem(&painter);
QTime time = QTime::currentTime();
QDate date = QDate::currentDate();
if(this->pCurrentsDates!=date){
this->pCurrentsDates=date;
this->tLunarCalendar.GetLunarCalendars(pCurrentsDates.year(),pCurrentsDates.month(),pCurrentsDates.day(),this->tLunarDateInfo);
}
//绘制重心年份
DrawCentersItems(&painter,date);
//绘制月份
DrawMonthPointer(&painter,date);
//绘制日期
DrawDaysPointers(&painter,date);
//绘制时针
DrawHourPointers(&painter,time);
//绘制分针
DrawMinutPointer(&painter,time);
//绘制秒针
DrawSecsPointers(&painter,time);
}
/// 绘制背景
/// \brief DrawsBackgrounds
/// \param painter
///
void Lncf_QtTextClocked::DrawsBackgrounds(QPainter *painter)
{
painter->save();
painter->setPen(Qt::NoPen);
int radius = 99;
if(this->tDashboardData.cBackgroundArr.count()>0)
{
QConicalGradient coneGradient(0, 0, 180.0);
int sCount=tDashboardData.cBackgroundArr.count();
for(int s=0;s<sCount;s++){
coneGradient.setColorAt(tDashboardData.cBackgroundArr[s].fBkgndAngleVal,tDashboardData.cBackgroundArr[s].cBkgndAngleClr);
}
painter->setBrush(coneGradient);
}
else{
painter->setBrush(this->tDashboardData.cBackgroundClr);
}
painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
painter->restore();
painter->save();
painter->setBrush(Qt::NoBrush);
QPen pen;
pen.setColor(this->tDashboardData.cBorderClrsVal);
radius = 96;
pen.setWidthF(6);
painter->setPen(pen);
painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
painter->restore();
painter->save();
radius = 93;
pen.setWidthF(0.25);
painter->setPen(pen);
painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
painter->restore();
}
/// 绘制刻度
/// \brief DrawAnglesValues
/// \param painter
///
void Lncf_QtTextClocked::DrawAnglesValues(QPainter *painter)
{
int radius1 = 98,radius2=94;
painter->save();
QPen pen;
pen.setCapStyle(Qt::RoundCap);
for (int i = 0; i < 360; i++)
{
if(i%10==0){
pen.setColor(this->tDashboardData.cCurrSecondClr);
pen.setWidthF(0.3);
painter->setPen(pen);
painter->drawLine(0, radius2+(radius1-radius2)*0.6, 0, radius1);
}
else{
pen.setColor(tDashboardData.cAngleLineClrs);
pen.setWidthF(0.25);
painter->setPen(pen);
painter->drawLine(0, radius2+(radius1-radius2)*0.9, 0, radius1);
}
painter->rotate(1);
}
QFont font;
int offset = 0;
font.setPixelSize((radius1-radius2)*3.0/6.0);
painter->setFont(font);
painter->setPen(tDashboardData.cAngleTxtColor);
qreal offsetVal=(radius1-radius2);
QRectF rect(-radius1+offsetVal / 2, -radius1+offsetVal / 2, radius1 * 2 - offsetVal, radius1 * 2 - offsetVal);
//QRectF rect(-radius + 2 / 2, -radius + 2 / 2, radius * 2 - 2, radius * 2 - 2);
for (int i = 0; i < 36; i++) {
QString text = QString("%1").arg((i+1))+"0";
#if (QT_VERSION < QT_VERSION_CHECK(5,11,0))
double textWidth = painter->fontMetrics().width(text);
double textHeight = painter->fontMetrics().height();
#else
double textWidth = painter->fontMetrics().horizontalAdvance(text);
double textHeight = painter->fontMetrics().height();
#endif
painter->rotate(10);
QRectF titleRect(-textWidth / 2, -rect.height() / 2 + offset, textWidth, textHeight);
painter->drawText(titleRect, Qt::AlignCenter, text);
}
painter->restore();
}
/// 绘制时间线
/// \brief Lncf_QtTextClocked::DrawTimeLineItem
/// \param painter
///
void Lncf_QtTextClocked::DrawTimeLineItem(QPainter *painter)
{
painter->save();
QPen pen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cTimeLineColor);
pen.setWidthF(0.2);
painter->setPen(pen);
painter->setBrush(Qt::NoBrush);
painter->drawLine(0,3,92,3);
painter->restore();
}
/// 绘制中心年份
/// \brief DrawCentersItems
/// \param painter
///
void Lncf_QtTextClocked::DrawCentersItems(QPainter *painter,const QDate date)
{
//绘制年份
painter->save();
painter->setPen(Qt::NoPen);
if(this->tDashboardData.bHasShowBkgClr){
painter->setBrush(this->tDashboardData.cYearBkgColors);
painter->drawEllipse(-14, -14, 14 * 2, 14 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dYearsFontSize);
painter->setFont(font);
QString sYear = tLunarDateInfo.szLunarYear;
sYear+="-["+tLunarDateInfo.szZodiacTag+"]";
sYear+=QString::fromStdU16String(u"年");
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cYearTagColors);
painter->drawText(QRectF(-15,-6.5,30,10),Qt::AlignCenter,sYear);
font.setPixelSize(this->tDashboardData.dWeekFontsSize);
painter->setFont(font);
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cCurrSecondClr);
painter->drawText(QRectF(-15,2,30,10),Qt::AlignCenter,date.toString("dddd"));
painter->restore();
}
/// 绘制月份
/// \brief DrawMonthPointer
/// \param painter
///
void Lncf_QtTextClocked::DrawMonthPointer(QPainter *painter,const QDate date)
{
painter->save();
//绘制月份
int month=date.month();
int radius = 13;
painter->setBrush(Qt::NoBrush);
if(this->tDashboardData.bHasShowBkgClr){
QPen pen;
pen.setColor(this->tDashboardData.cMonthBkgColor);
pen.setWidthF(13);
painter->setPen(pen);
painter->drawEllipse(-21, -21, 21 * 2, 21 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dMonthFontSize);
painter->setFont(font);
for(int i=12;i>0;i--)
{
if(i==12)
{
painter->save();
painter->setPen(tDashboardData.cCurrMonColors);
QString sMonth = "["+tLunarDateInfo.szLunarMonthTag+"]-";
sMonth+=QString::fromStdU16String(sMonthTextList.at(--month));
painter->drawText(QRectF(radius,-1.5,20,5),Qt::AlignHorizontal_Mask,sMonth);
painter->restore();
}
else{
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMonthTagColor);
painter->drawText(QRectF(radius,-2.5,14,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sMonthTextList.at(--month)));
}
if(month==0)
month=sMonthTextList.count();
painter->rotate(30.0);
}
painter->restore();
}
/// 绘制日期
/// \brief DrawDaysPointers
/// \param painter
///
void Lncf_QtTextClocked::DrawDaysPointers(QPainter *painter,const QDate date)
{
painter->save();
//绘制日期
int day=date.day();
int radius = 27;
painter->setBrush(Qt::NoBrush);
if(this->tDashboardData.bHasShowBkgClr){
QPen pen;
pen.setColor(this->tDashboardData.cDaysBkgColors);
pen.setWidthF(16);
painter->setPen(pen);
painter->drawEllipse(-35, -35, 35 * 2, 35 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dDaysFontsSize);
painter->setFont(font);
for(int i=date.daysInMonth();i>0;i--)
{
if(i==date.daysInMonth())
{
painter->save();
painter->setPen(this->tDashboardData.cCurrDaysColor);
QString sDays = "["+tLunarDateInfo.szLunarDaysTag+"]-";
sDays+=QString::fromStdU16String(sDaysTextsList.at(--day));
painter->drawText(QRectF(radius+1,-0.75,18,5),Qt::AlignHorizontal_Mask,sDays);
painter->restore();
}
else{
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cDaysTagColors);
painter->drawText(QRectF(radius,-2.5,14,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sDaysTextsList.at(--day)));
}
if(day==0)
day=date.daysInMonth();
painter->rotate(360.0/date.daysInMonth());
}
painter->restore();
}
/// 绘制时针数据
/// \brief DrawHourPointers
/// \param painter
///
void Lncf_QtTextClocked::DrawHourPointers(QPainter *painter,const QTime time)
{
painter->save();
//绘制时针
int hour=time.hour();
int radius = 43;
painter->setBrush(Qt::NoBrush);
if(this->tDashboardData.bHasShowBkgClr){
QPen pen;
pen.setColor(this->tDashboardData.cHoursBkgColor);
pen.setWidthF(18);
painter->setPen(pen);
painter->drawEllipse(-52, -52, 52 * 2, 52 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dHoursFontSize);
painter->setFont(font);
//QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cHoursTagColor;
for(int i=24;i>0;i--)
{
if(i==24)
{
painter->save();
painter->setPen(this->tDashboardData.cCurrHourColor);
QString sHour = "["+QString::fromStdU16String(GetLunarHoursVal(hour))+"]-";
sHour+=QString::fromStdU16String(sHourTextsList.at(hour));
painter->drawText(QRectF(radius+3.5,-1.5,18,5),Qt::AlignHorizontal_Mask,sHour);
painter->restore();
}
else{
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cHoursTagColor);
painter->drawText(QRectF(radius,-2.5,17,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sHourTextsList.at(hour)));
}
if(hour==0)
hour=this->sHourTextsList.count();
painter->rotate(15.0);
hour-=1;
}
painter->restore();
}
/// 绘制分针数据
/// \brief DrawMinutPointer
/// \param painter
///
void Lncf_QtTextClocked::DrawMinutPointer(QPainter *painter,const QTime time)
{
painter->save();
//绘制分针
int minute=time.minute();
int radius = 61;
painter->setBrush(Qt::NoBrush);
if(this->tDashboardData.bHasShowBkgClr){
QPen pen;
pen.setColor(this->tDashboardData.cMinuteBkgClrs);
pen.setWidthF(16);
painter->setPen(pen);
painter->drawEllipse(-69, -69, 69 * 2, 69 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dMinutFontSize);
painter->setFont(font);
//QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMinuteTagClrs;
for(int i=60;i>0;i--)
{
if(i==60)
{
painter->save();
painter->setPen(tDashboardData.cCurrMinuteClr);
QString sMinute = "["+QString::fromStdU16String(GetLunarMinutVal(time.hour(),minute))+"]-";
sMinute+=QString::fromStdU16String(sMinuteTxtList.at(minute));
painter->drawText(QRectF(radius+1,-0.75,17,5),Qt::AlignHorizontal_Mask,sMinute);
painter->restore();
}
else{
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cMinuteTagClrs);
painter->drawText(QRectF(radius,-2.5,15,5),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sMinuteTxtList.at(minute)));
}
painter->rotate(6.0);
if(minute==0)
minute=this->sMinuteTxtList.count();
minute-=1;
}
painter->restore();
}
/// 绘制秒针数据
/// \brief DrawSecsPointers
/// \param painter
///
void Lncf_QtTextClocked::DrawSecsPointers(QPainter *painter,const QTime time)
{
int second=time.second();
int radius = 77;
painter->save();
painter->setBrush(Qt::NoBrush);
if(this->tDashboardData.bHasShowBkgClr){
QPen pen;
pen.setColor(this->tDashboardData.cSecondBkgClrs);
pen.setWidthF(16);
painter->setPen(pen);
painter->drawEllipse(-85, -85, 85 * 2, 85 * 2);
}
QFont font =this->pClockTextFont;
font.setPixelSize(this->tDashboardData.dSecsFontsSize);
painter->setFont(font);
//QColor tagColor = tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cSecondTagClrs;
for(int i=60;i>0;i--)
{
if(i==60)
{
painter->save();
painter->setPen(this->tDashboardData.cCurrSecondClr);
painter->drawText(QRectF(radius,-1.5,15,4),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sSecondTxtList.at(second)));
painter->restore();
}
else{
painter->setPen(tDashboardData.bRandomLineClr?QColor::fromHsl(rand()%360,rand()%256,rand()%200):this->tDashboardData.cSecondTagClrs);
painter->drawText(QRectF(radius,-2.5,15,4),Qt::AlignHorizontal_Mask,QString::fromStdU16String(sSecondTxtList.at(second)));
}
painter->rotate(6.0);
if(second==0)
second=this->sSecondTxtList.count();
second-=1;
}
painter->restore();
}
有关详细信息,请加QQ群:717743458。