现在的位置: 首页 > 综合 > 正文

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

2014年04月05日 ⁄ 综合 ⁄ 共 6022字 ⁄ 字号 评论关闭

转载请注明转载地址: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等控件简单的实现了时钟的多样化的显示,其中值得注意的是信号和槽的使用非常灵活,界面的设置布局也是初学者应该注重的,其中容易犯错的是定义对象和指针的时候,容易找不到定义的位置和头文件忘记写的习惯,所以这个值得注意!

初次写博客,很多细节需要大家指正,谢谢~

抱歉!评论已关闭.