Qt学习——电子时钟

中间的冒号是一秒闪烁一次

新建一个继承自QLCDNumber的类

头文件:

#ifndef DIGICLOCK_H
#define DIGICLOCK_H

#include <QLCDNumber>

class DIgiClock : public QLCDNumber
{
    Q_OBJECT
public:
    DIgiClock(QWidget *parent = 0);
    void mousePressEvent(QMouseEvent *);//重载函数响应鼠标按下
    void mouseMoveEvent(QMouseEvent *);//重载函数响应鼠标移动
public slots:
    void ShowTime();
private:
    QPoint dragPosition;
    bool showColon;
};

#endif // DIGICLOCK_H

源文件:

#include "digiclock.h"
#include <QTime>
#include <QTimer>
#include <QMouseEvent>

DIgiClock::DIgiClock(QWidget *parent) :
    QLCDNumber(parent)
{
    QPalette p=palette();
    p.setColor(QPalette::Window,Qt::blue);
    setPalette(p);

    setWindowFlags(Qt::FramelessWindowHint);
    setWindowOpacity(0.5);

    QTimer *timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ShowTime()));
    timer->start(500);
    ShowTime();
    resize(150,60);
    showColon=true;
}

void DIgiClock::ShowTime()
{
    QTime time=QTime::currentTime();
    QString text=time.toString("hh:mm");
    if(showColon)
    {
        text[2]=':';
        showColon=false;
    }
    else
    {
        text[2]=' ';
        showColon=true;
    }
    display(text);
}

void DIgiClock::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        dragPosition=event->globalPos()-frameGeometry().topLeft();
        event->accept();
    }
    else if(event->button()==Qt::RightButton)
    {
        close();
    }
}
void DIgiClock::mouseMoveEvent(QMouseEvent *event)
{
    move(event->globalPos()-dragPosition);
    event->accept();
}

上述代码主要有三点:

1,显示时间:

    QTimer *timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(ShowTime()));
    timer->start(500);
每隔500毫秒调用一下ShowTime()槽函数。

void DIgiClock::ShowTime()
{
    QTime time=QTime::currentTime();
    QString text=time.toString("hh:mm");
    if(showColon)
    {
        text[2]=':';
        showColon=false;
    }
    else
    {
        text[2]=' ';
        showColon=true;
    }
    display(text);
}
获取当前时间,然后放到QString中,然后调用父类方法display出来,这里的QString就有限制了,只能是QLCDNumber能显示的内容才行。

其中中间冒号间歇出现。

2,响应鼠标按下

void DIgiClock::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        dragPosition=event->globalPos()-frameGeometry().topLeft();
        event->accept();
    }
    else if(event->button()==Qt::RightButton)
    {
        close();
    }
}

左键记录按下的位置,右键关闭

3,响应鼠标拖动

void DIgiClock::mouseMoveEvent(QMouseEvent *event)
{
    move(event->globalPos()-dragPosition);
    event->accept();
}
利用move函数将程序移动到指定位置,由于是窗口左上角移动到什么地方,所以这里做了计算。

计算内容应该是拖动的位置减去上一次位置的差加上左上角位置:

frameGeometry().topLeft()+【event->globalPos(当前位置)-event->globalPos(按下时候)】

拖动的位置减去上一次位置就计算出来左上角应该移动的位置差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章