其实是一个很简单的Demo,可以编译了拿NSIS打包。最近在做富文本编辑器和补C++不记得的东西吧,项目遥遥无期。

 //clock.pro

 #-------------------------------------------------
#
# Project created by QtCreator --26T19::
#
#------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = Clock
TEMPLATE = app SOURCES += main.cpp \
digtalwidget.cpp HEADERS += \
digtalwidget.h RESOURCES += \
resource.qrc DISTFILES += \
icon.rc RC_FILE += \
icon.rc
 //digtalwidget.h(名字少打了一个i orz)

 #ifndef DIGTALWIDGET_H
#define DIGTALWIDGET_H #include <QWidget>
#include <QPoint>
#include <QPalette>
#include <QColor>
#include <QTime>
#include <QTimer>
#include <QMouseEvent>
#include <QDebug>
#include <QLabel>
#include <QGridLayout>
#include <QMap>
#include <QList>
#include <QStringList>
#include <QPixmap>
#include <QHBoxLayout>
#include <QIcon>
#include <QPaintEvent>
#include <QPainter>
#include <QAction>
#include <QBitmap>
#include <QSettings>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QApplication>
#include <QFile> class DigtalWidget;
class NumberManger; #define NUMSFIXEDWIDTH 30
#define NUMSFIXEDHEIGHT NUMSFIXEDWIDTH*2
#define FRAMEFIXWIDTH NUMSFIXEDWIDTH*11
#define FRAMEFIXHEIGHT NUMSFIXEDWIDTH*3
#define SETTING_FULLINFOM ".\\clocksetttings\\settings.ini"
#define REG_RUN "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" class DigtalWidget : public QWidget
{
Q_OBJECT
public:
explicit DigtalWidget(QWidget *parent = );
~DigtalWidget();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *);
private slots:
void showTimer();
void changeStyle();
void iconActivated(QSystemTrayIcon::ActivationReason reason);
void changeAutoStart();
void quitAndSet();
private:
void initItem();
void addRightMenu();
void createTrayMenu();
void createTrayIcon();
void writeSettings();
void readSettings();
void setAutoStart(); QPoint dragPositon;
QList<QLabel *> timeNumsLabelList;
QHBoxLayout *mainLayout;
NumberManger *numMan;
QTimer *numTimer;
QPixmap frameBackground;
QAction *rightMenu_Close,*rightMenu_Hide,*trayMenu_AutoStart,
*trayMenu_Close,*trayMenu_Normal, *trayMenu_Hide;
QList<QAction *> rightMenu_Style; QMenu *trayMenu;
QSystemTrayIcon *trayIcon; bool if_auto_start = false;
}; class NumberManger
{
friend class DigtalWidget;
public:
NumberManger();
NumberManger(const QString &);
void setStyle(const QString &);
void setStyle(QString &&); private:
QStringList styleList{"Flat","Pink"};
QList<QPixmap> nums;
QPixmap cutStyle;
QString nowStyle = "Flat";
}; #endif // DIGTALWIDGET_H
 //digtalwidget.cpp

 #include "digtalwidget.h"

 DigtalWidget::DigtalWidget(QWidget *parent)
: QWidget(parent)
{
//...............
move(, );//设定初始位置
initItem();
createTrayIcon();
readSettings(); frameBackground.load(tr(":/num/digitalNums/frame.png"),
,//默认加载模式
Qt::AvoidDither|Qt::ThresholdAlphaDither|Qt::ThresholdDither);
frameBackground = frameBackground.scaled(FRAMEFIXWIDTH,FRAMEFIXHEIGHT); setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::Tool|Qt::X11BypassWindowManagerHint);
setAttribute(Qt::WA_TranslucentBackground);
setWindowOpacity(0.95);//设置整体窗口透明度
setWindowIcon(QIcon(tr(":/images/clockIcon.png")));
setWindowTitle(tr("My Clock"));
setMask(frameBackground.mask());
//...............
addRightMenu();
setContextMenuPolicy(Qt::ActionsContextMenu);//开启右键菜单 showTimer();
resize(frameBackground.size());
} void DigtalWidget::initItem()
{
numMan = new NumberManger("Flat");
numTimer = new QTimer(this);
connect(numTimer,SIGNAL(timeout()), this, SLOT(showTimer()));
numTimer->start();//1000ms启动计时器 for(int i = ;i < ;i++)
timeNumsLabelList << new QLabel(""); mainLayout = new QHBoxLayout(this);
mainLayout->addSpacing();
for(int i = ;i < ;i++)
mainLayout->addWidget(timeNumsLabelList[i]);
mainLayout->addSpacing();
mainLayout->setMargin();
} void DigtalWidget::addRightMenu()
{
for(const auto &name : numMan->styleList)
{
QIcon icon(QObject::tr(":/num/digitalNums/") + name + tr("/rightMenuIcon.png"));
QString showName(name + tr(" style"));
QAction *tmp = new QAction(icon,showName,this);
rightMenu_Style << tmp;
addAction(tmp);
connect(tmp, SIGNAL(triggered()), this, SLOT(changeStyle()));
} rightMenu_Hide = new QAction(QIcon(":/pushButtons/pushButtons/showMinimized.png"),tr("隐藏"),this);
addAction(rightMenu_Hide);
connect(rightMenu_Hide,SIGNAL(triggered()),this,SLOT(hide())); rightMenu_Close = new QAction(QIcon(":/pushButtons/pushButtons/close.png"),tr("关闭"),this);
addAction(rightMenu_Close);
connect(rightMenu_Close, SIGNAL(triggered()),this,SLOT(quitAndSet()));
} void DigtalWidget::createTrayIcon()
{
if(!QSystemTrayIcon::isSystemTrayAvailable())//如果不支持系统托盘图标就退出
return;
createTrayMenu();
trayIcon = new QSystemTrayIcon;
trayIcon->setIcon(QIcon(":/images/clockIcon.png")); trayIcon->setToolTip(tr("Philip's clock V1.0"));
trayIcon->setContextMenu(trayMenu);
trayIcon->show(); connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
} void DigtalWidget::createTrayMenu()
{
trayMenu = new QMenu(this); trayMenu_AutoStart = new QAction(tr("程序自启动"),this);
trayMenu->addAction(trayMenu_AutoStart);
connect(trayMenu_AutoStart,SIGNAL(triggered()),this,SLOT(changeAutoStart())); trayMenu_Hide = new QAction(QIcon(":/pushButtons/pushButtons/hide.png"),tr("隐藏"),this);
trayMenu->addAction(trayMenu_Hide);
connect(trayMenu_Hide,SIGNAL(triggered()),this,SLOT(hide())); trayMenu_Normal = new QAction(QIcon(":/pushButtons/pushButtons/normal.png"),tr("显示"),this);
trayMenu->addAction(trayMenu_Normal);
connect(trayMenu_Normal,SIGNAL(triggered()),this,SLOT(showNormal())); trayMenu->addSeparator();//插一个分隔符 trayMenu_Close = new QAction(QIcon(":/pushButtons/pushButtons/close.png"),tr("关闭"),this);
trayMenu->addAction(trayMenu_Close);
connect(trayMenu_Close, SIGNAL(triggered()),this,SLOT(quitAndSet()));//注意任务栏图标的关闭必须使用qApp的才能关
} void DigtalWidget::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason)
{
case QSystemTrayIcon::DoubleClick:case QSystemTrayIcon::Trigger:
showNormal();
break;
case QSystemTrayIcon::MiddleClick:
trayIcon->showMessage(tr("From Philip:"),tr("Hi!"));
break;
default:
break;
}
} void DigtalWidget::changeAutoStart()
{
if_auto_start = !if_auto_start;
setAutoStart();
} void DigtalWidget::setAutoStart()
{
QString appName = QApplication::applicationName();
QSettings regSettings(REG_RUN,QSettings::NativeFormat); if(!if_auto_start)//去除自启动信息
{
trayMenu_AutoStart->setIcon(QIcon(""));
regSettings.remove(appName);
}
else//添加信息
{
QString appPath = QApplication::applicationFilePath();
regSettings.setValue(appName,appPath.replace("/","\\"));
trayMenu_AutoStart->setIcon(QIcon(":/images/check.png"));
}
} void DigtalWidget::writeSettings()
{
QSettings appBaseSettings(tr(SETTING_FULLINFOM),QSettings::IniFormat);//表示读取的是ini文件
appBaseSettings.setValue("/Geometry",saveGeometry());
appBaseSettings.setValue("/ifAutoRuning",if_auto_start);
appBaseSettings.setValue("/style",numMan->nowStyle);
} void DigtalWidget::readSettings()
{
QFile file(tr(SETTING_FULLINFOM));
if(!file.open(QIODevice::ReadOnly))
return;//不存在配置文件 QSettings appBaseSettings(tr(SETTING_FULLINFOM),QSettings::IniFormat);//表示读取的是ini文件 restoreGeometry(appBaseSettings.value("/Geometry").toByteArray()); if_auto_start = appBaseSettings.value("/ifAutoRuning").toBool();
setAutoStart(); numMan->nowStyle = appBaseSettings.value("/style").toString();
numMan->setStyle(numMan->nowStyle);
} void DigtalWidget::quitAndSet()
{
writeSettings();
QApplication::quit();
} void DigtalWidget::showTimer()
{
QTime time = QTime::currentTime();
QString text = time.toString("hh:mm:ss"); for(int i = ; i < text.count(); i++)
{
if(text[i] != ':')
{
int k = text[i].cell() - '';
timeNumsLabelList[i]->setPixmap(numMan->nums[k]);
}
else
timeNumsLabelList[i]->setPixmap(numMan->cutStyle);
}
} void DigtalWidget::changeStyle()
{
QAction *catchAction = qobject_cast<QAction *>(sender());
auto name = catchAction->text();
name.replace(" style" , "", Qt::CaseSensitive);
numMan->setStyle(name);
showTimer();//强行刷新一次时间,去除延迟
} void DigtalWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
dragPositon = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
} void DigtalWidget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
move(event->globalPos() - dragPositon);
event->accept();
}
} void DigtalWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(,,frameBackground);
} DigtalWidget::~DigtalWidget()
{
delete numMan;
} NumberManger::NumberManger()
{
setStyle(nowStyle);
} NumberManger::NumberManger(const QString &style)
{
setStyle(style);
} void NumberManger::setStyle(const QString &style)
{
nums.clear();
for(int i = ;i < ;i++)
{
QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/%1.png").arg(i));
QPixmap m(s);
m = m.scaled(NUMSFIXEDWIDTH,NUMSFIXEDHEIGHT,Qt::KeepAspectRatio);
nums << m;
}
QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/cut.png"));
QPixmap m(s);
cutStyle = m.scaled((int)(NUMSFIXEDWIDTH/1.5),(int)(NUMSFIXEDHEIGHT/1.5));
nowStyle = style;
} void NumberManger::setStyle(QString &&style)
{
nums.clear();
for(int i = ;i < ;i++)
{
QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/%1.png").arg(i));
QPixmap m(s);
m = m.scaled(NUMSFIXEDWIDTH,NUMSFIXEDHEIGHT,Qt::KeepAspectRatio);
nums << m;
}
QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/cut.png"));
QPixmap m(s);
cutStyle = m.scaled((int)(NUMSFIXEDWIDTH/1.5),(int)(NUMSFIXEDHEIGHT/1.5));
nowStyle = style;
}
 //main.cpp

 #include <QApplication>
#include "digtalwidget.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DigtalWidget *widget = new DigtalWidget; widget->show(); return a.exec();
}

时钟Demo的更多相关文章

  1. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  2. canvas写的一个小时钟demo

    <!DOCTYPE html> <html> <head> <title>HTML5 Canvas Demo of clock</title> ...

  3. Qt: 时钟Demo

    其实是一个很简单的Demo,可以编译了拿NSIS打包.最近在做富文本编辑器和补C++不记得的东西吧,项目遥遥无期. //clock.pro #----------------------------- ...

  4. 用js写的时钟Demo

    css代码: <style type="text/css"> .a { width: 200px; height: 100px; position: absolute; ...

  5. canvas时钟demo

    显示效果如下 源码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  7. css变形 transform【转】

    transition:过度属性 transition-property 规定设置过度效果的css属性的名称,默认可以写all transition-duration 规定完成过度效果需要多少秒或毫秒 ...

  8. iOS开发-CGAffineTransformMakeRotation改变了中心解决的方法

    坑爹的.  为了这个问题折腾了2个小时. 恼.. 今天在写一个时钟demo的时候, 时针的旋转用到了CGAffineTransformMakeRotation, 按理说. 图像的旋转是以图像本身的中心 ...

  9. 前端特效demo | 一起围观 10 种创意时钟

    时钟动画应用非常广泛,我们经常会看到一些相当个性化的HTML5时钟动画.今天我们向大家分享 10 款形态各异的超时尚时钟动画,其中有圆盘时钟.创意时钟.电子时钟等,希望大家会喜欢. 文内附有时钟效果代 ...

随机推荐

  1. 从开发的角度对zigbee安全的杂谈

    说起zigbee应该很少人听过,这个B名字怪怪的... 以前开发不懂开发的思想,前前后后花了很久时间,现在回想起来,突然想从安全的角度来理解数据的传输 废话:伴随科技的快速演进,物联网(The Int ...

  2. ORACLE PL/SQL 实例精解之第四章 条件控制:if 语句

    4.1 IF 语句 IF语句两种形式:IF-THEN IF-THEN-ELSE 使用IF-THEN,可以指定需要执行的一组动作. IF-THEN-ELSE语句指定两组动作 1. IF-THEN TRU ...

  3. Android HandlerThread源码解析

    在上一章Handler源码解析文章中,我们知道App的主线程通过Handler机制完成了一个线程的消息循环.那么我们自己也可以新建一个线程,在线程里面创建一个Looper,完成消息循环,可以做一些定时 ...

  4. 洛谷 - P2887 - 防晒霜Sunscreen - 贪心

    https://www.luogu.org/problemnew/show/P2887 感觉可以: 把防晒霜拆点限制流量为瓶数,奶牛拆点限制流量为1,当某个防晒霜与奶牛匹配时连一条边,求最大流.但是这 ...

  5. 【弱的C艹之路。。未完待续】

    [弱的C艹之路] 数据范围 unsigned int 0-4294967295 int 2147483648-2147483647 unsigned long 0-4294967295 long 21 ...

  6. [官方教程] Unity 5 BLACKSMITH深度分享 - 汇总帖

    BLACKSMITH深度分享系列 相信此大片在Unite上的惊艳亮相,让许多人至今无法忘却它所带来的震撼,Unity的大师们为了让更多Unity开发者了解此大片是如何用Unity5诞生的,深度分享了多 ...

  7. android 在一个应用中启动另一个应用

    在程序开发过程当中,常遇到需要启动另一个应用程序的情况,比如在点击软件的一个按钮可以打开地图软件. 如果既有包名又有主类的名字,那就好 办了, 直接像下面就行: [html]  Intent inte ...

  8. Luogu P1613跑路【倍增】By cellur925

    题目传送门 开始的思路:直接跑一遍最短路,得到最短路的那个值.然后把那个值进行一下二进制拆分,看能拆几次.(可能是受到了刚做过的题影响) ;i>=;i--) { <<i)>qw ...

  9. 本周学习总结(ng-zorro/MDN索引/读书笔记)

    按钮 <button ng-button nzType="primary">Primary</button> nzType="" pri ...

  10. iOS Swift3 用全局“宏”时要注意的问题

    当你需要定义一个APP全局“宏”来调用 UserDefaults.standard里存储的值的时候, 一定要将这个“宏”定义为计算属性,否则你得到的值只会在APP启动的时候计算一次. 示例如下: va ...