您的位置:首页 > 编程语言 > Qt开发

Qt专题一:时钟的多种实现方式

2014-03-03 20:46 369 查看
转载请注明转载地址:http://write.blog.csdn.net/postedit?ref=toolbar

Qt是基于C++语言开发的,Qt最为集成开发工具,现在非常普遍,开发应用程序非常好,类库非常丰富,所以学习也得花时间,把基本的类都学会了,也就差不多掌握Qt的开发了,不过大同小异,MFC可以比较早,对于使用Qt的一个好处就是,可以实现跨平台的开发,特别是当前比较实用的在linux下的开发,物联网的智能终端的实现,给很多从事嵌入式初级开发的人带来很大的方便,本人也在这上面学习了一年,还不算是入门吧~感觉学的东西太多了,一开始就在linux上花费大量时间,尤其是对linux
的环境的配置方面,然后进一步对arm板子的使用,代码的移植种种、真是非得有千万的耐心才能坚持下来啊~不多废话了,直接上图,有图有真相~最后是代码!!!

Qt有很多种实现时钟的方式,最基本的基本就是直接画出圆形的时钟,没有新意,现在来实现LCDnumber、label、wiget等控件来实现对其的实现,显示时间、日期。下面给出效果图(这是去年写的,现在才发表):



头文件什么的都不用细说了

#ifndef ANALOGCLOCK_H

#define ANALOGCLOCK_H

#include <QtGui/QWidget>

class AnalogClock : public QWidget

{

Q_OBJECT

public:

AnalogClock(QWidget *parent = 0);

~AnalogClock();

protected:

void paintEvent(QPaintEvent *event);

private slots:

void on_time_close_clicked();

void on_DateTimeSaveButton_clicked();

void editTime();

void updateLcdTime();

};

#endif // ANALOGCLOCK_H

下面直接对app进行说明吧

#include "analogclock.h"

#include"QTimer"

#include"qpainter.h"

#include"QTime"

#include"QWidget"

#include<c.h>

#include<ui_c.h>

AnalogClock::AnalogClock(QWidget *parent)

: QWidget(parent)

{



ui->setupUi(this);

QTimer *timer = new QTimer(this);

connect(timer, SIGNAL(timeout()), this, SLOT(update()));

setWindowTitle(tr("系统时钟"));

timer=new QTimer(this);

ui->dateEdit->setFocus();

ui->dateEdit->setDate(QDate::currentDate());

connect(timer,SIGNAL(timeout()),this,SLOT(updateLcdTime()));

connect(timer,SIGNAL(timeout()),this,SLOT(editTime()));

connect(timer, SIGNAL(timeout()),ui->clockwidget, SLOT(update()));//画出模拟时钟。

timer->start(1000);

}

AnalogClock::~AnalogClock()

{

}

//下面这个是重要的绘制时钟的代码

void AnalogClock::paintEvent(QPaintEvent *)

{

static const QPoint hourHand[3] = { //对小时针的位置绘制

QPoint(7, 8),

QPoint(-7, 8),

QPoint(0, -40)

};

static const QPoint minuteHand[3] = { //对分钟针的位置绘制

QPoint(7, 8),

QPoint(-7, 8),

QPoint(0, -70)

};

static const QPoint secondHand[3]={ //对秒钟针的位置绘制

QPoint(7, 8),

QPoint(-7, 8),

QPoint(0, -90)

};

QColor hourColor(127, 0, 127);

QColor minuteColor(0, 127, 127, 191);

QColor secondColor(127, 127,0,120); //对时、分、秒的颜色绘制

int side = qMin(width(), height());

QTime time = QTime::currentTime();

QPainter painter(this);

QPixmap pix;

pix.load("/home/chenfeng/c/image/8.jpg");

// QTimer::singleShot( 100, this, SLOT(animateTimeout()) );

// pix.load("/home/chenfeng/chap01/c/1.png");

painter.drawPixmap(0,0,320,240,pix);

painter.setRenderHint(QPainter::Antialiasing);

painter.translate(width() / 2, height() / 2);

painter.scale(side / 200.0, side / 200.0); //

painter.setPen(Qt::NoPen);

painter.setBrush(hourColor);

painter.save();

painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));

painter.drawConvexPolygon(hourHand, 3);

painter.restore();

painter.setPen(hourColor);

for (int i = 0; i < 12; ++i)

{

painter.drawLine(88, 0, 96, 0);

painter.rotate(30.0);

}

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(minuteColor);

for (int j = 0; j < 60; ++j) {

if ((j % 5) != 0)

painter.drawLine(92, 0, 96, 0);

painter.rotate(6.0);

}

painter.setPen(Qt::yellow);

painter.setBrush(secondColor);

painter.save();

painter.rotate(6.0*time.second());

painter.drawConvexPolygon(secondHand,3);

painter.restore();

}

void analogclock::updateLcdTime()//更新时间,这个是使用lcdnumber实现显示时间的功能

{

ui->lcdNumber->display(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

}

void analogclock::editTime()//编辑时间,实现时间、日期的显示~

{

if(ui->timeEdit->hasFocus())

{

disconnect(timer,SIGNAL(timeout()),this,SLOT(editTime()));

}

else

{

ui->timeEdit->setTime(QTime::currentTime());

}

}

void analogclock::on_DateTimeSaveButton_clicked()//更新保存 ,保存时间更改按钮实现

{

QString year,month,day,hour,minuth,secont;

qDebug()<<ui->dateEdit->text()<<endl;

qDebug()<<ui->timeEdit->text()<<endl;

QStringList tempDate = ui->dateEdit->text().split("-");

QStringList tempTime = ui->timeEdit->text().split(":");

year = tempDate.at(0);

month = tempDate.at(1);

day = tempDate.at(2);

hour = tempTime.at(0);

minuth = tempTime.at(1);

secont = tempTime.at(2);

qDebug()<<year<<month<<day<<endl;

qDebug()<<hour<<minuth<<secont<<endl;

QString str = month+day+hour+minuth+year+"."+secont;

qDebug()<<str<<endl;

QProcess *process= new QProcess(this);

QString program="date";

QStringList argument;

argument<<tr("%1").arg(str);

process->start(program,argument);

if(!process->waitForFinished(-1))

{

QMessageBox::warning(this,tr("失败"),tr("设置时间失败!"));

return;

}

qDebug()<<"error"<<process->errorString()<<endl;

qDebug()<<"error2"<<process->error()<<endl;

program="hwclock";

argument.clear();

argument<<"-w";

process->start(program,argument);

if(!process->waitForFinished(-1))

{

QMessageBox::warning(this,tr("失败"),tr("设置时间失败!"));

return;

}

qDebug()<<"error"<<process->errorString()<<endl;

qDebug()<<"error2"<<process->error()<<endl;

ui->DateTimeSaveButton->setEnabled(true);

QMessageBox message;

message.setWindowTitle(" 成功完成");

message.setIcon(QMessageBox::Information);

message.setText(tr("你设置日期为 %1。时间为 %2").arg(ui->dateEdit->date().toString("yyyy年MM月dd日"),ui->timeEdit->time().toString("hh:mm:ss")));

message.setInformativeText(tr("请关闭对话框!"));

message.setStandardButtons(QMessageBox::Ok);

message.setDefaultButton(QMessageBox::Ok);

message.setButtonText(QMessageBox::Ok,"确定");

message.setWindowFlags(Qt::WindowStaysOnTopHint|Qt::WindowSystemMenuHint);

message.exec();

}

以上代码使用editime、lcdnumber、pushbutton、widget、tabwidget等控件简单的实现了时钟的多样化的显示,其中值得注意的是信号和槽的使用非常灵活,界面的设置布局也是初学者应该注重的,其中容易犯错的是定义对象和指针的时候,容易找不到定义的位置和头文件忘记写的习惯,所以这个值得注意!

初次写博客,很多细节需要大家指正,谢谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: