基于qt开发的简单小时钟
刚学qt不久,先试着做一个简单的小时钟满足下我的小心肝。大致思路就是先画表盘,画表针,画时间文本,然后实现时钟的动态走动,最后添加背景图,实现去除边框后的点击拖动,大功告成!附上最后的效果图跟源码,注释还是蛮详细的,嘻嘻
#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H
#include <QWidget>
#include<QToolBox>
#include<QPoint>
#include<QPushButton>
class AnalogClock : public QWidget
{
Q_OBJECT
public:
AnalogClock(QWidget *parent = 0);
void minWidget();
void closeWidget();
void paintEvent(QPaintEvent *event) ;
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
QRectF textRectf(double r,int pointSize,double angle);
private:
bool m_pressed;//窗口是否被点击
QPoint m_point;//点击的位置
};
#endif
#include<QTimer>
#include<QTime>
#include<QtMath>
#include<QFont>
#include<QDebug>
#include<QVBoxLayout>
#include<QHBoxLayout>
#include<QMouseEvent>
#include<QPainter>
#include "widget.h"
AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer = new QTimer(this);
QPushButton *min_btn=new QPushButton(this);
QPushButton *close_btn=new QPushButton(this);
QHBoxLayout *hlayout=new QHBoxLayout();
/////////////////////////////////////////////////////////
//添加最小化和关闭按钮,自定义标题栏
min_btn->setFixedSize(50,50);
min_btn->setText("—");
min_btn->setFlat(true);
close_btn->setFixedSize(50,50);
close_btn->setText("X");
close_btn->setFlat(true);
hlayout->addStretch();
hlayout->addWidget(min_btn);
hlayout->addWidget(close_btn);
hlayout->setContentsMargins(0,0,5,0);
QVBoxLayout *mainlayout=new QVBoxLayout(this);
mainlayout->addLayout(hlayout);
mainlayout->addStretch();
mainlayout->setContentsMargins(0,0,0,0);
setLayout(mainlayout);
//////////////////////////////////////////////////////////////////////
connect(timer, SIGNAL(timeout()), this, SLOT(repaint()));
connect(min_btn,&QPushButton::clicked,this,&AnalogClock::minWidget);
connect(close_btn,&QPushButton::clicked,this,&AnalogClock::closeWidget);
timer->start(1000);
setWindowTitle(tr("Analog Clock"));
setWindowFlags(Qt::FramelessWindowHint);//设置无标题栏窗体
//setStyleSheet("background-color:gray;");
//resize(250, 250);
setMinimumSize(550,550);
}
void AnalogClock::minWidget()
{
this->showMinimized();
}
void AnalogClock::closeWidget()
{
this->close();
}
void AnalogClock::mousePressEvent(QMouseEvent *event)
{
//第一种无边框移动窗体的方法
// if (ReleaseCapture())
// SendMessage(HWND(winId()),WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);
// event->ignore();
//第二种
if(event->button()==Qt::LeftButton)
{
m_pressed=true;
m_point=event->pos();
}
}
void AnalogClock::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
m_pressed=false;
}
void AnalogClock::mouseMoveEvent(QMouseEvent *event)
{
if(m_pressed)
move(event->pos()-m_point+pos());
}
//绘制文本区域
QRectF AnalogClock::textRectf(double r, int pointSize, double angle)
{
QRectF rectf;
//pointsize字体大小
rectf.setX(r*qCos(angle*M_PI/180.0)-pointSize*2);
rectf.setY(r*qSin(angle*M_PI/180.0)-pointSize);
rectf.setWidth(pointSize*4);
rectf.setHeight(pointSize*2);
return rectf;
}
void AnalogClock::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
//表针初始位置
static QPoint hourHand[3] = {
QPoint(8, 8),
QPoint(-8, 8),
QPoint(0, -40)
};
static QPoint minuteHand[3] = {
QPoint(6, 9),
QPoint(-6, 9),
QPoint(0, -70)
};
static QPoint secondHand[3] = {
QPoint(5, 10),
QPoint(-5, 10),
QPoint(0, -90)
};
QColor hourColor(127, 0, 127);
QColor minuteColor(0, 127, 127, 191);
QColor secondColor(127,127, 0);
//按宽高缩放较小的进行坐标缩放
int side = qMin(width(), height());
QTime time = QTime::currentTime();
QPainter painter(this);
//主窗体透明1,2
//1,采用背景色
//painter.fillRect(rect(),QColor(50,50,50,80));
//2,采用背景图片
//setAttribute(Qt::WA_TranslucentBackground,true);
QPixmap pixmap("C:/Users/achang/Desktop/QTdemo/KuGouDemo/skin/小清新.png");
painter.drawPixmap(0,0,width(),height(),pixmap);
painter.setRenderHint(QPainter::Antialiasing);//去锯齿
painter.translate(width()/2, height()/2);//将坐标原点平移到(100,100)
painter.scale(side /250.0, side /250.0);//将x,y坐标扩大到side/250倍
//画钟盘时线
painter.setPen(hourColor);
for (int i = 0; i <12; i++)
{
painter.drawLine(0, 88, 0, 96);
painter.rotate(30.0);
}
//画小时文本
painter.setPen(hourColor);
int r=108;
QFont font=painter.font();
int pointSize=font.pointSize();
for(int i=0;i<12;i++)
{
int num;
if(i==0)
num=12;
else
num=i;
painter.drawText(textRectf(r,pointSize,i*30-90),Qt::AlignCenter,QString::number(num));
}
//时针
painter.setPen(Qt::NoPen);
painter.setBrush(hourColor);
painter.save();//save保存,restore恢复,成对出现
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
//分针
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
// //秒针
painter.setPen(Qt::NoPen);
painter.setBrush(secondColor);
painter.save();
painter.rotate(6.0 * time.second());
painter.drawConvexPolygon(secondHand, 3);
painter.restore();
//画钟盘分线
painter.setPen(Qt::NoPen);
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 96, 0);
painter.rotate(6.0);
}
}