#include "my_time.h"
#include "QDate"
#include "qdebug.h"
#include "qpainter.h"
#include "qtimer.h"
#include "ui_my_time.h"
#include <QDir>
#include <QFileInfo>
#include <QMouseEvent>
#include <QSettings>
#include <QSize>
#define UI_WIDTH 850
#define UI_HIGH 850
#define UI_MID_WIDTH (UI_WIDTH / 2)
#define UI_MID_HIGH (UI_HIGH / 2)
#define ONE_CIRCLE_WIDTH 68
#define AUTO_RUN "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"
my_time::my_time(QWidget* parent)
: QMainWindow(parent)
, ui(new Ui::my_time)
{
ui->setupUi(this);
//this->setFixedSize(UI_WIDTH, UI_HIGH);
window_width = this->width();
window_high = this->height();
QTimer* pTimer = new QTimer(this);
pTimer->setTimerType(Qt::PreciseTimer);
pTimer->start(50); /* 定时 10ms;每10ms刷新一次界面 */
connect(pTimer, SIGNAL(timeout()), this, SLOT(update()));
coord_init();
pix = QPixmap(UI_WIDTH, UI_HIGH);
this->setAttribute(Qt::WA_TranslucentBackground, true);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setWindowModality(Qt::WindowModal);
setProcessAutoRun(QApplication::applicationFilePath(), 1);
}
void my_time::mousePressEvent(QMouseEvent* event)
{
QMainWindow::mousePressEvent(event);
if (nullptr == event)
return;
if (event->button() == Qt::MidButton) {
isDragging = true;
mouse_startPoint = event->globalPos();
window_top_left_point = this->frameGeometry().topLeft();
}
}
void my_time::mouseMoveEvent(QMouseEvent* event)
{
QMainWindow::mouseMoveEvent(event);
if (nullptr == event) {
return;
}
if (isDragging) {
QPoint distence = event->globalPos() - mouse_startPoint;
this->move(window_top_left_point + distence);
}
}
void my_time::mouseReleaseEvent(QMouseEvent* event)
{
QMainWindow::mouseReleaseEvent(event);
if (nullptr == event)
return;
if (event->button() == Qt::LeftButton)
isDragging = false;
}
void my_time::setProcessAutoRun(const QString& appPath, bool flag)
{
QSettings settings(AUTO_RUN, QSettings::NativeFormat);
//以程序名称作为注册表中的键,根据键获取对应的值(程序路径)
QFileInfo fInfo(appPath);
QString name = fInfo.baseName(); //键-名称
//如果注册表中的路径和当前程序路径不一样,则表示没有设置自启动或本自启动程序已经更换了路径
QString oldPath = settings.value(name).toString(); //获取目前的值-绝对路劲
QString newPath = QDir::toNativeSeparators(appPath); //toNativeSeparators函数将"/"替换为"\"
if (flag) {
if (oldPath != newPath)
settings.setValue(name, newPath);
} else
settings.remove(name);
}
void my_time::coord_init()
{
for (uint8_t i = 0; i < 60; i++) {
min_x[i] = cos((-i * 0.104719753)) * (UI_MID_WIDTH - ONE_CIRCLE_WIDTH * 2) + UI_MID_WIDTH;
min_y[i] = sin(-i * 0.104719753) * (UI_MID_HIGH - ONE_CIRCLE_WIDTH * 2) + UI_MID_HIGH;
}
for (uint8_t i = 0; i < 24; i++) {
hour_x[i] = cos((-i * 0.261799383)) * (UI_MID_WIDTH - ONE_CIRCLE_WIDTH * 3) + UI_MID_WIDTH;
hour_y[i] = sin(-i * 0.261799383) * (UI_MID_HIGH - ONE_CIRCLE_WIDTH * 3) + UI_MID_HIGH;
}
for (uint8_t i = 0; i < 31; i++) {
day_x[i] = cos((-i) * 0.202683) * (UI_MID_WIDTH - ONE_CIRCLE_WIDTH * 4) + UI_MID_WIDTH;
day_y[i] = sin((-i) * 0.202683) * (UI_MID_HIGH - ONE_CIRCLE_WIDTH * 4) + UI_MID_HIGH;
}
for (uint8_t i = 0; i < 12; i++) {
month_x[i] = cos((-i) * 0.52359876) * (UI_MID_WIDTH - ONE_CIRCLE_WIDTH * 5) + UI_MID_WIDTH;
month_y[i] = sin((-i) * 0.52359876) * (UI_MID_HIGH - ONE_CIRCLE_WIDTH * 5) + UI_MID_HIGH;
}
}
void my_time::paintEvent(QPaintEvent* event)
{
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_tim = current_date_time.toString("zzz");
QString current_date = current_date_time.toString("yyyy-MM-dd-ddd");
//qDebug() << "start" << current_tim;
QStringList second;
window_width = this->width();
window_high = this->height();
// if (last_window_high != window_high || last_window_width != window_width) {
// last_window_high = window_high;
// last_window_width = window_width;
// return;
// }
second << "零"
<< "一"
<< "二"
<< "三"
<< "四"
<< "五"
<< "六"
<< "七"
<< "八"
<< "九"
<< "十"
<< "十一"
<< "十二"
<< "十三"
<< "十四"
<< "十五"
<< "十六"
<< "十七"
<< "十八"
<< "十九"
<< "二十"
<< "二十一"
<< "二十二"
<< "二十三"
<< "二十四"
<< "二十五"
<< "二十六"
<< "二十七"
<< "二十八"
<< "二十九"
<< "三十"
<< "三十一"
<< "三十二"
<< "三十三"
<< "三十四"
<< "三十五"
<< "三十六"
<< "三十七"
<< "三十八"
<< "三十九"
<< "四十"
<< "四十一"
<< "四十二"
<< "四十三"
<< "四十四"
<< "四十五"
<< "四十六"
<< "四十七"
<< "四十八"
<< "四十九"
<< "五十"
<< "五十一"
<< "五十二"
<< "五十三"
<< "五十四"
<< "五十五"
<< "五十六"
<< "五十七"
<< "五十八"
<< "五十九";
QFont font("黑体", 9, QFont::Black, false);
font.setBold(true);
//设置字符间的间距
font.setLetterSpacing(QFont::AbsoluteSpacing, 5);
current_tim = current_date_time.toString("ss");
int sec = current_tim.toInt();
current_tim = current_date_time.toString("zzz");
int ms = current_tim.toInt();
/* 画秒盘 */
QPixmap sec_pix = pix; //临时画布
QPainter pain_sec(&sec_pix);
pain_sec.setFont(font);
pain_sec.setPen(Qt::red);
for (uint8_t i = 0; i < second.count(); i++) {
//使用字体
int32_t x = 0;
int32_t y = 0;
x = cos((-i * 0.104719753) - (0.104719753 - ms * 0.000104719753)) * (UI_MID_WIDTH - ONE_CIRCLE_WIDTH) + UI_MID_WIDTH;
y = sin(-i * 0.104719753 - (0.104719753 - ms * 0.000104719753)) * (UI_MID_HIGH - ONE_CIRCLE_WIDTH) + UI_MID_HIGH;
pain_sec.save();
pain_sec.translate(x, y);
pain_sec.rotate((-i) * 6);
pain_sec.translate(-x, -y);
QString str = second[(sec + i) % 60] + "秒";
float opacity = 0.3;
if (i == 0) {
opacity = ((ms * 0.001)) < 0.3 ? 0.3 : ((ms * 0.001));
pain_sec.setOpacity(opacity);
} else if (i == (second.count() - 1)) {
opacity = (1 - (ms * 0.001)) < 0.3 ? 0.3 : (1 - (ms * 0.001));
pain_sec.setOpacity(opacity);
} else {
pain_sec.setOpacity(0.3);
}
pain_sec.drawText(x, y, str);
pain_sec.restore();
}
QSize picSize(window_width, window_high);
QPixmap tmp_sec_pix = sec_pix.scaled(picSize);
QPainter painter_play(this);
painter_play.drawPixmap(0, 0, tmp_sec_pix);
/* 画分盘 85ms*/
current_tim = current_date_time.toString("mm");
int min = current_tim.toInt();
/* 当分改变时才重新画底布 */
if (minute != min) {
//使用字体
QPixmap tmp_pix = QPixmap(UI_WIDTH, UI_HIGH); //临时�