面向对象编程实践—桌面时钟的设计(Qt实现)
桌面时钟是指集数字时钟、指针时钟、桌面月历、倒计时、日记本和闹铃提醒、备忘录提醒、整点半点报时、网络对时、定时关机、天气预报、定时任务、密码保护、在线更新、锁屏保护等功能于一身的一种桌面软件。桌面时钟一般存在于桌面右侧竖列,根据软件编写的不同,具有不同的体现形式。大多数桌面时钟软件可以实现功能模块的定制,可以根据自己的需要显示不同的功能模块。桌面时钟的形态也可以通过下载的桌面时钟软件改变。
利用Qt,仅综合实现了数字时钟,指针时钟以及日历。
#include "calendar.h"
#include <QtGui>
Calendar::Calendar()
{
createPreviewGroupBox();
QGridLayout *layout = new QGridLayout;
layout->addWidget(previewGroupBox);
layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(layout);
}
void Calendar::createPreviewGroupBox()
{
calendar = new QCalendarWidget;
calendar->setGridVisible(true);//是否显示日历框中的线格
previewGroupBox = new QGroupBox(tr("日历查阅"));
previewLayout = new QGridLayout;
previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
previewGroupBox->setLayout(previewLayout);
}
#ifndef CALENDAR_H
#define CALENDAR_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QCalendarWidget;
class QGridLayout;
class QGroupBox;
QT_END_NAMESPACE
class Calendar : public QWidget
{
Q_OBJECT
public:
Calendar();
private:
void createPreviewGroupBox();
QGroupBox *previewGroupBox;
QGridLayout *previewLayout;
QCalendarWidget *calendar;
};
#endif // CALENDAR_H
#include <QTime>
#include "clock.h"
Clock::Clock(QWidget *parent)
: QWidget(parent)
{
QTimer *timer=new QTimer(this);
timer->start(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
}
void Clock::paintEvent(QPaintEvent *)
{
QPainter paint(this);
QTime time=QTime::currentTime();
paint.translate(100,100);
paint.setRenderHint(QPainter::Antialiasing);
paint.setBrush(Qt::red);
paint.setPen(Qt::red);
paint.save();
paint.rotate(6.0*time.second());
paint.drawConvexPolygon(sed,4);
paint.restore();
paint.setBrush(Qt::blue);
paint.setPen(Qt::blue);
paint.save();
paint.rotate(6.0*(time.minute()+time.second()/60.0));
paint.drawConvexPolygon(min,4);
paint.restore();
paint.setBrush(Qt::black);
paint.setPen(Qt::black);
paint.save();
paint.rotate(30.0*(time.hour()+time.minute()/60.0));
paint.drawConvexPolygon(hour,4);
paint.restore();
for(int i=0;i<12;i++)
{
paint.drawLine(0,-98,0,-90);
paint.rotate(6);
for (int j=0;j<4;j++)
{
paint.drawLine(0,-98,0,-97);
paint.rotate(6);
}
}
}
#ifndef CLOCK_H
#define CLOCK_H
#include <QtGui/QWidget>
#include <QPainter>
#include <QTimer>
static QPoint sed[4]={QPoint(0,-70),QPoint(2,0),QPoint(0,10),QPoint(-2,0)};
static QPoint min[4]={QPoint(0,-60),QPoint(4,0),QPoint(0,12),QPoint(-4,0)};
static QPoint hour[4]={QPoint(0,-50),QPoint(6,0),QPoint(0,13),QPoint(-6,0)};
class Clock : public QWidget
{
Q_OBJECT
public:
Clock(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
};
#endif // CLOCK_H
#include "digitalclock.h"
#include <QTime>
DigitalClock::DigitalClock(QWidget *parent)
: QLCDNumber(parent)
{
QTimer *timer = new QTimer(this);
timer->start(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(showTime()));
showTime();
}
void DigitalClock::showTime()
{
QTime time = QTime::currentTime();
QString text = time.toString("hh:mm");
if ((time.second() % 2) == 0)
text[2] = '';
setSegmentStyle(Flat);
display(text);
}
#ifndef DIGITALCLOCK_H
#define DIGITALCLOCK_H
#include <QtGui/QDialog>
#include <QLCDNumber>
#include <QTimer>
class DigitalClock : public QLCDNumber
{
Q_OBJECT
public:
DigitalClock(QWidget *parent = 0);
private slots:
void showTime();
};
#endif // DIGITALCLOCK_H
#include "mainclock.h"
#include "clock.h"
#include "digitalclock.h"
#include "calendar.h"
#include <QGroupBox>
#include <QLabel>
#include <QBoxLayout>
#include <QTextCodec>
#include <QDate>
MainClock::MainClock(QWidget *parent)
: QWidget(parent)
{
QTextCodec::setCodecForTr(QTextCodec::codecForLocale()) ;//正常显示汉字
QDate date = QDate::currentDate();
QString text1 = date.toString(tr(" yyyy年MM月dd日"));
QString text2 = date.toString(tr(" dddd"));
//刻度时间
Clock *clock=new Clock;
QGroupBox *groupbox1=new QGroupBox(tr("刻度时间"));
QVBoxLayout *layout1=new QVBoxLayout ;
layout1->addWidget(clock);
groupbox1->setLayout(layout1);
QFont font1 = groupbox1->font();
font1.setPointSize(12);
font1.setBold(true);
groupbox1->setFont(font1);
//当日日期与数字时间
QLabel *label1=new QLabel(text1) ;
QLabel *label2=new QLabel(text2) ;
QGroupBox *groupbox2=new QGroupBox(tr("今天是"));
QVBoxLayout *layout2=new QVBoxLayout ;
layout2->addWidget(label1);
layout2->addWidget(label2);
groupbox2->setLayout(layout2);
DigitalClock *digitalClock=new DigitalClock ;
QVBoxLayout *layout3=new QVBoxLayout ;
layout3->addWidget(groupbox2);
layout3->addWidget(digitalClock);
QFont font2 = label1->font();
font2.setPointSize(24);
font2.setBold(true);
label1->setFont(font2);
QPalette palette1;
palette1.setColor(QPalette::WindowText,Qt::red);
label1->setPalette(palette1);
QFont font3 = label2->font();
font3.setPointSize(24);
font3.setBold(true);
label2->setFont(font3);
QPalette palette2;
palette2.setColor(QPalette::WindowText,Qt::red);
label2->setPalette(palette2);
QFont font4 = groupbox2->font();
font4.setPointSize(12);
font4.setBold(true);
groupbox2->setFont(font4);
QHBoxLayout *layout4=new QHBoxLayout ;
layout4->addWidget(groupbox1);
layout4->addLayout(layout3);
//日历查询
Calendar *calendar=new Calendar ;
QVBoxLayout *layout5=new QVBoxLayout ;
layout5->addLayout(layout4);
layout5->addWidget(calendar);
setLayout(layout5);
layout5->setSizeConstraint(QLayout::SetMinAndMaxSize);
QFont font5 = calendar->font();
font5.setPointSize(12);
font5.setBold(true);
calendar->setFont(font5);
resize(500,490) ;
}
#ifndef MAINCLOCK_H
#define MAINCLOCK_H
#include <QWidget>
class MainClock: public QWidget
{
public :
MainClock(QWidget *parent = 0) ;
};
#endif // MAINCLOCK_H
#include <QtGui/QApplication>
#include "mainclock.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainClock clock;
clock.show();
return a.exec();
}