时钟Demo

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

 1 //clock.pro
 2 
 3 #-------------------------------------------------
 4 #
 5 # Project created by QtCreator 2016-07-26T19:06:54
 6 #
 7 #-------------------------------------------------
 8 
 9 QT       += core gui
10 
11 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
12 
13 TARGET = Clock
14 TEMPLATE = app
15 
16 
17 SOURCES += main.cpp \
18     digtalwidget.cpp
19 
20 HEADERS  += \
21     digtalwidget.h
22 
23 RESOURCES += \
24     resource.qrc
25 
26 DISTFILES += \
27     icon.rc
28     
29 RC_FILE += \
30     icon.rc
  1 //digtalwidget.h(名字少打了一个i orz)
  2 
  3 #ifndef DIGTALWIDGET_H
  4 #define DIGTALWIDGET_H
  5 
  6 #include <QWidget>
  7 #include <QPoint>
  8 #include <QPalette>
  9 #include <QColor>
 10 #include <QTime>
 11 #include <QTimer>
 12 #include <QMouseEvent>
 13 #include <QDebug>
 14 #include <QLabel>
 15 #include <QGridLayout>
 16 #include <QMap>
 17 #include <QList>
 18 #include <QStringList>
 19 #include <QPixmap>
 20 #include <QHBoxLayout>
 21 #include <QIcon>
 22 #include <QPaintEvent>
 23 #include <QPainter>
 24 #include <QAction>
 25 #include <QBitmap>
 26 #include <QSettings>
 27 #include <QSystemTrayIcon>
 28 #include <QMenu>
 29 #include <QApplication>
 30 #include <QFile>
 31 
 32 class DigtalWidget;
 33 class NumberManger;
 34 
 35 #define NUMSFIXEDWIDTH 30
 36 #define NUMSFIXEDHEIGHT NUMSFIXEDWIDTH*2
 37 #define FRAMEFIXWIDTH NUMSFIXEDWIDTH*11
 38 #define FRAMEFIXHEIGHT NUMSFIXEDWIDTH*3
 39 #define SETTING_FULLINFOM ".\\clocksetttings\\settings.ini"
 40 #define REG_RUN "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"
 41 
 42 class DigtalWidget : public QWidget
 43 {
 44     Q_OBJECT
 45 public:
 46     explicit DigtalWidget(QWidget *parent = 0);
 47     ~DigtalWidget();
 48 protected:
 49     void mousePressEvent(QMouseEvent *event);
 50     void mouseMoveEvent(QMouseEvent *event);
 51     void paintEvent(QPaintEvent *);
 52 private slots:
 53     void showTimer();
 54     void changeStyle();
 55     void iconActivated(QSystemTrayIcon::ActivationReason reason);
 56     void changeAutoStart();
 57     void quitAndSet();
 58 private:
 59     void initItem();
 60     void addRightMenu();
 61     void createTrayMenu();
 62     void createTrayIcon();
 63     void writeSettings();
 64     void readSettings();
 65     void setAutoStart();
 66     
 67     QPoint dragPositon;
 68     QList<QLabel *> timeNumsLabelList;
 69     QHBoxLayout *mainLayout;
 70     NumberManger *numMan;
 71     QTimer *numTimer;
 72     QPixmap frameBackground;
 73     QAction *rightMenu_Close,*rightMenu_Hide,*trayMenu_AutoStart,
 74             *trayMenu_Close,*trayMenu_Normal, *trayMenu_Hide;
 75     QList<QAction *> rightMenu_Style;
 76     
 77     QMenu *trayMenu;
 78     QSystemTrayIcon *trayIcon;
 79     
 80     bool if_auto_start = false;
 81 };
 82 
 83 class NumberManger
 84 {
 85     friend class DigtalWidget;
 86 public:
 87     NumberManger();
 88     NumberManger(const QString &);
 89     void setStyle(const QString &);
 90     void setStyle(QString &&);
 91     
 92 private:
 93     QStringList styleList{"Flat","Pink"};
 94     QList<QPixmap> nums;
 95     QPixmap cutStyle;
 96     QString nowStyle = "Flat";
 97 };
 98 
 99 
100 #endif // DIGTALWIDGET_H
  1 //digtalwidget.cpp
  2 
  3 #include "digtalwidget.h"
  4 
  5 DigtalWidget::DigtalWidget(QWidget *parent) 
  6     : QWidget(parent)
  7 {
  8     //...............
  9     move(1552, 82);//设定初始位置
 10     initItem();
 11     createTrayIcon();
 12     readSettings();
 13     
 14     frameBackground.load(tr(":/num/digitalNums/frame.png"),
 15                          0,//默认加载模式
 16                          Qt::AvoidDither|Qt::ThresholdAlphaDither|Qt::ThresholdDither);
 17     frameBackground = frameBackground.scaled(FRAMEFIXWIDTH,FRAMEFIXHEIGHT);
 18     
 19     setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::Tool|Qt::X11BypassWindowManagerHint);
 20     setAttribute(Qt::WA_TranslucentBackground);
 21     setWindowOpacity(0.95);//设置整体窗口透明度
 22     setWindowIcon(QIcon(tr(":/images/clockIcon.png")));
 23     setWindowTitle(tr("My Clock"));
 24     setMask(frameBackground.mask());
 25     //...............
 26     addRightMenu();
 27     setContextMenuPolicy(Qt::ActionsContextMenu);//开启右键菜单
 28 
 29     showTimer();
 30     resize(frameBackground.size());
 31 }
 32 
 33 void DigtalWidget::initItem()
 34 {
 35     numMan = new NumberManger("Flat");
 36     numTimer = new QTimer(this);
 37     connect(numTimer,SIGNAL(timeout()), this, SLOT(showTimer()));
 38     numTimer->start(1000);//1000ms启动计时器
 39     
 40     for(int i = 0;i < 8;i++)
 41         timeNumsLabelList << new QLabel("");
 42     
 43     mainLayout = new QHBoxLayout(this);
 44     mainLayout->addSpacing(18);
 45     for(int i = 0;i < 8;i++)
 46         mainLayout->addWidget(timeNumsLabelList[i]);
 47     mainLayout->addSpacing(25);
 48     mainLayout->setMargin(10);
 49 }
 50 
 51 void DigtalWidget::addRightMenu()
 52 {
 53     for(const auto &name : numMan->styleList)
 54     {
 55         QIcon icon(QObject::tr(":/num/digitalNums/") + name + tr("/rightMenuIcon.png"));
 56         QString showName(name + tr(" style"));
 57         QAction *tmp = new QAction(icon,showName,this);
 58         rightMenu_Style << tmp;
 59         addAction(tmp);
 60         connect(tmp, SIGNAL(triggered()), this, SLOT(changeStyle()));
 61     }
 62     
 63     rightMenu_Hide = new QAction(QIcon(":/pushButtons/pushButtons/showMinimized.png"),tr("隐藏"),this);
 64     addAction(rightMenu_Hide);
 65     connect(rightMenu_Hide,SIGNAL(triggered()),this,SLOT(hide()));
 66     
 67     rightMenu_Close = new QAction(QIcon(":/pushButtons/pushButtons/close.png"),tr("关闭"),this);
 68     addAction(rightMenu_Close);
 69     connect(rightMenu_Close, SIGNAL(triggered()),this,SLOT(quitAndSet()));
 70 }
 71 
 72 void DigtalWidget::createTrayIcon()
 73 {
 74     if(!QSystemTrayIcon::isSystemTrayAvailable())//如果不支持系统托盘图标就退出
 75         return;
 76     createTrayMenu();
 77     trayIcon = new QSystemTrayIcon;
 78     trayIcon->setIcon(QIcon(":/images/clockIcon.png"));
 79     
 80     trayIcon->setToolTip(tr("Philip's clock V1.0"));
 81     trayIcon->setContextMenu(trayMenu);
 82     trayIcon->show();
 83     
 84     connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
 85             this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
 86 }
 87 
 88 void DigtalWidget::createTrayMenu()
 89 {
 90     trayMenu = new QMenu(this);
 91     
 92     trayMenu_AutoStart = new QAction(tr("程序自启动"),this);
 93     trayMenu->addAction(trayMenu_AutoStart);
 94     connect(trayMenu_AutoStart,SIGNAL(triggered()),this,SLOT(changeAutoStart()));
 95     
 96     trayMenu_Hide = new QAction(QIcon(":/pushButtons/pushButtons/hide.png"),tr("隐藏"),this);
 97     trayMenu->addAction(trayMenu_Hide);
 98     connect(trayMenu_Hide,SIGNAL(triggered()),this,SLOT(hide()));
 99     
100     trayMenu_Normal = new QAction(QIcon(":/pushButtons/pushButtons/normal.png"),tr("显示"),this);
101     trayMenu->addAction(trayMenu_Normal);
102     connect(trayMenu_Normal,SIGNAL(triggered()),this,SLOT(showNormal()));
103     
104     trayMenu->addSeparator();//插一个分隔符
105     
106     trayMenu_Close = new QAction(QIcon(":/pushButtons/pushButtons/close.png"),tr("关闭"),this);
107     trayMenu->addAction(trayMenu_Close);
108     connect(trayMenu_Close, SIGNAL(triggered()),this,SLOT(quitAndSet()));//注意任务栏图标的关闭必须使用qApp的才能关
109 }
110 
111 void DigtalWidget::iconActivated(QSystemTrayIcon::ActivationReason reason)
112 {
113     switch (reason) 
114     {
115     case QSystemTrayIcon::DoubleClick:case QSystemTrayIcon::Trigger:
116         showNormal();
117         break;
118     case QSystemTrayIcon::MiddleClick:
119         trayIcon->showMessage(tr("From Philip:"),tr("Hi!"));
120         break;
121     default:
122         break;
123     }
124 }
125 
126 void DigtalWidget::changeAutoStart()
127 {
128     if_auto_start = !if_auto_start;
129     setAutoStart();
130 }
131 
132 void DigtalWidget::setAutoStart()
133 {
134     QString appName = QApplication::applicationName();
135     QSettings regSettings(REG_RUN,QSettings::NativeFormat);
136     
137     if(!if_auto_start)//去除自启动信息
138     {
139         trayMenu_AutoStart->setIcon(QIcon(""));
140         regSettings.remove(appName);
141     }
142     else//添加信息
143     {
144         QString appPath = QApplication::applicationFilePath();
145         regSettings.setValue(appName,appPath.replace("/","\\"));
146         trayMenu_AutoStart->setIcon(QIcon(":/images/check.png"));
147     }
148 }
149 
150 void DigtalWidget::writeSettings()
151 {
152     QSettings appBaseSettings(tr(SETTING_FULLINFOM),QSettings::IniFormat);//表示读取的是ini文件
153     appBaseSettings.setValue("/Geometry",saveGeometry());
154     appBaseSettings.setValue("/ifAutoRuning",if_auto_start);
155     appBaseSettings.setValue("/style",numMan->nowStyle);
156 }
157 
158 void DigtalWidget::readSettings()
159 {
160     QFile file(tr(SETTING_FULLINFOM));
161     if(!file.open(QIODevice::ReadOnly))
162         return;//不存在配置文件
163     
164     QSettings appBaseSettings(tr(SETTING_FULLINFOM),QSettings::IniFormat);//表示读取的是ini文件
165     
166     restoreGeometry(appBaseSettings.value("/Geometry").toByteArray());
167     
168     if_auto_start = appBaseSettings.value("/ifAutoRuning").toBool();
169     setAutoStart();
170     
171     numMan->nowStyle = appBaseSettings.value("/style").toString();
172     numMan->setStyle(numMan->nowStyle);
173 }
174 
175 void DigtalWidget::quitAndSet()
176 {
177     writeSettings();
178     QApplication::quit();
179 }
180 
181 void DigtalWidget::showTimer()
182 {
183     QTime time = QTime::currentTime();
184     QString text = time.toString("hh:mm:ss");
185     
186     for(int i = 0; i < text.count(); i++)
187     {
188         if(text[i] != ':')
189         {
190             int k = text[i].cell() - '0';
191             timeNumsLabelList[i]->setPixmap(numMan->nums[k]);
192         }
193         else
194             timeNumsLabelList[i]->setPixmap(numMan->cutStyle);
195     }
196 }
197 
198 void DigtalWidget::changeStyle()
199 {
200     QAction *catchAction = qobject_cast<QAction *>(sender());
201     auto name = catchAction->text();
202     name.replace(" style" , "", Qt::CaseSensitive);
203     numMan->setStyle(name);
204     showTimer();//强行刷新一次时间,去除延迟
205 }
206 
207 void DigtalWidget::mousePressEvent(QMouseEvent *event)
208 {
209     if(event->button() == Qt::LeftButton)    
210     {
211         dragPositon = event->globalPos() - frameGeometry().topLeft();
212         event->accept();
213     }
214 }
215 
216 void DigtalWidget::mouseMoveEvent(QMouseEvent *event)
217 {
218     if(event->buttons() & Qt::LeftButton)
219     {
220         move(event->globalPos() - dragPositon);
221         event->accept();
222     }
223 }
224 
225 void DigtalWidget::paintEvent(QPaintEvent *)
226 {
227     QPainter painter(this);
228     painter.drawPixmap(0,0,frameBackground);
229 }
230 
231 DigtalWidget::~DigtalWidget()
232 {
233     delete numMan;
234 }
235 
236 NumberManger::NumberManger()
237 {
238     setStyle(nowStyle);
239 }
240 
241 NumberManger::NumberManger(const QString &style)
242 {
243     setStyle(style);
244 }
245 
246 void NumberManger::setStyle(const QString &style)
247 {
248     nums.clear();
249     for(int i = 0;i < 10;i++)
250     {
251         QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/%1.png").arg(i));
252         QPixmap m(s);
253         m = m.scaled(NUMSFIXEDWIDTH,NUMSFIXEDHEIGHT,Qt::KeepAspectRatio);
254         nums << m;
255     }
256     QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/cut.png"));
257     QPixmap m(s);
258     cutStyle = m.scaled((int)(NUMSFIXEDWIDTH/1.5),(int)(NUMSFIXEDHEIGHT/1.5));
259     nowStyle = style;
260 }
261 
262 void NumberManger::setStyle(QString &&style)
263 {
264     nums.clear();
265     for(int i = 0;i < 10;i++)
266     {
267         QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/%1.png").arg(i));
268         QPixmap m(s);
269         m = m.scaled(NUMSFIXEDWIDTH,NUMSFIXEDHEIGHT,Qt::KeepAspectRatio);
270         nums << m;
271     }
272     QString s(QObject::tr(":/num/digitalNums/") + style + QObject::tr("/cut.png"));
273     QPixmap m(s);
274     cutStyle = m.scaled((int)(NUMSFIXEDWIDTH/1.5),(int)(NUMSFIXEDHEIGHT/1.5));
275     nowStyle = style;
276 }
 1 //main.cpp
 2 
 3 #include <QApplication>
 4 #include "digtalwidget.h"
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication a(argc, argv);
 9     DigtalWidget *widget = new DigtalWidget;
10     
11     widget->show();
12     
13     return a.exec();
14 }

 

posted @ 2016-08-03 21:22  PhiliAI  阅读(298)  评论(0编辑  收藏  举报