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等控件简单的实现了时钟的多样化的显示,其中值得注意的是信号和槽的使用非常灵活,界面的设置布局也是初学者应该注重的,其中容易犯错的是定义对象和指针的时候,容易找不到定义的位置和头文件忘记写的习惯,所以这个值得注意!
初次写博客,很多细节需要大家指正,谢谢~
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等控件简单的实现了时钟的多样化的显示,其中值得注意的是信号和槽的使用非常灵活,界面的设置布局也是初学者应该注重的,其中容易犯错的是定义对象和指针的时候,容易找不到定义的位置和头文件忘记写的习惯,所以这个值得注意!
初次写博客,很多细节需要大家指正,谢谢~
相关文章推荐
- 生产者/消费者问题的多种Java实现方式
- 在 unity 中使用三种简单的方式实现实时时钟动画
- html中div使用CSS实现水平/垂直居中的多种方式
- 生产者/消费者问题的多种Java实现方式
- 字符串拼接多种实现方式及性能详解
- 多种方式实现JS调用后台方法进行数据交互
- Android多种方式实现自定义Dialog对话框
- 多种方式实现lamp
- JavaScript实现tab选项卡(多种方式)
- 多种方式实现在Android 手机上抓包
- Spring学习总结(三)——Spring实现AOP的多种方式
- View 浮在软键盘上多种实现方式及踩坑
- js随机颜色代码的多种实现方式
- 使用多种方式实现遍历HashMap的方法
- 多种方式实现控制器层
- C# 高性能 TCP 服务的多种实现方式
- redis多种方式实现访问计数器实例详解
- 生产者/消费者问题的多种Java实现方式
- Java实现多种方式遍历Map集合
- 设计模式之生产者消费者模式的多种实现方式(java)