diff --git a/0snap/moneytool.jpg b/0snap/moneytool.jpg new file mode 100644 index 0000000..34cc5fa Binary files /dev/null and b/0snap/moneytool.jpg differ diff --git a/QWidgetDemo.pro b/QWidgetDemo.pro index c016308..1a15560 100644 --- a/QWidgetDemo.pro +++ b/QWidgetDemo.pro @@ -37,6 +37,7 @@ SUBDIRS += imageswitch #图片开关控件 SUBDIRS += netserver #网络中转服务器 SUBDIRS += base64helper #图片文字base64互换 SUBDIRS += smoothcurve #平滑曲线 +SUBDIRS += moneytool #存款计算器 #限定windows系统加载下面的项目 win32 { diff --git a/README.md b/README.md index fe322af..9ba8a76 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ 5. **本项目开源的是下面表格中描述的内容,并未开源左侧的树状导航菜单控件,只是方便演示效果图直接用的自定义控件大全的效果图,懒得重新截图。** | 编号 | 文件夹 | 描述 | -| ------ | ------ | ------ | +| :------ | :------ | :------ | | 1 | lightbutton | 高亮按钮控件 | | 2 | movewidget | 通用控件移动类 | | 3 | flatui | 模仿flatui类 | @@ -50,6 +50,7 @@ | 41 | miniblink | miniblink示例 | | 42 | base64 | 图片文字base64互换 | | 43 | smoothcurve | 平滑曲线 | +| 44 | moneytool | 存款计算器 | #### 二、学习群 1. **Qt交流大会群 853086607(雨田哥)** @@ -57,48 +58,49 @@ 3. **Qt进阶之路群 734623697(武威的涛哥)** #### 三、效果图 -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lightbutton.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/movewidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/flatui.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/countcode.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/gifwidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/comtool.jpg) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/nettool.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/devicesizetable.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_psblack.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_lightblue.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_flatwhite.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/navbutton.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/videopanel.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/framelesswidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ipaddress.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/bgdemo.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/dbpage.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/pngtool.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/savelog.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/saveruntime.jpg) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/colorwidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/maskwidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/battery.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lineeditnext.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/zhtopy.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/qwtdemo.jpg) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/devicebutton.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/mouseline.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/emailtool.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ntpclient.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lunarcalendarwidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/videowidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/screenwidget.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/echartgauge.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/imageswitch.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ffmpegdemo.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/vlcdemo.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/key.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/live.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/netserver.jpg) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/designer.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/miniblink.jpg) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/base64.png) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/smoothcurve.gif) -![avatar](https://github.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/frameless.gif) \ No newline at end of file +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lightbutton.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/movewidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/flatui.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/countcode.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/gifwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/comtool.jpg) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/nettool.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/devicesizetable.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_psblack.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_lightblue.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/styledemo_flatwhite.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/navbutton.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/videopanel.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/framelesswidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ipaddress.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/bgdemo.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/dbpage.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/pngtool.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/savelog.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/saveruntime.jpg) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/colorwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/maskwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/battery.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lineeditnext.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/zhtopy.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/qwtdemo.jpg) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/devicebutton.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/mouseline.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/emailtool.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ntpclient.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/lunarcalendarwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/videowidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/screenwidget.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/echartgauge.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/imageswitch.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/ffmpegdemo.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/vlcdemo.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/key.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/live.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/netserver.jpg) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/designer.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/miniblink.jpg) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/base64.png) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/smoothcurve.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/frameless.gif) +![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/0snap/moneytool.jpg) \ No newline at end of file diff --git a/moneytool/main.cpp b/moneytool/main.cpp new file mode 100644 index 0000000..90b6d53 --- /dev/null +++ b/moneytool/main.cpp @@ -0,0 +1,11 @@ +#include "widget.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + Widget w; + w.show(); + + return a.exec(); +} diff --git a/moneytool/moneytool.pro b/moneytool/moneytool.pro new file mode 100644 index 0000000..0502909 --- /dev/null +++ b/moneytool/moneytool.pro @@ -0,0 +1,13 @@ +QT += core gui +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat + +TARGET = mouseline +TEMPLATE = app +DESTDIR = $$PWD/../bin +CONFIG += warn_off + +SOURCES += main.cpp +SOURCES += widget.cpp +HEADERS += widget.h +FORMS += widget.ui diff --git a/moneytool/widget.cpp b/moneytool/widget.cpp new file mode 100644 index 0000000..da6f68f --- /dev/null +++ b/moneytool/widget.cpp @@ -0,0 +1,50 @@ +#pragma execution_character_set("utf-8") +#include "widget.h" +#include "ui_widget.h" +#include "qmessagebox.h" +#include "qdebug.h" + +Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) +{ + ui->setupUi(this); +} + +Widget::~Widget() +{ + delete ui; +} + +void Widget::on_btnOk_clicked() +{ + //当前多少钱 + int moneyCurrent = ui->txtMoneyCurrent->text().toInt(); + //利息 + float rate = ui->txtRate->text().toFloat(); + //定期期限 + int year = ui->cboxYear->currentText().left(1).toInt(); + //总年份 必须是定期期限的倍数 + int years = ui->txtYears->text().toInt(); + //最终多少钱 + int moneyAll = 0; + + if (years % year != 0) { + ui->txtYears->setFocus(); + QMessageBox::critical(this, "错误", "总年份必须是期限的整数倍数!"); + return; + } + + if (ui->cboxType->currentIndex() == 0) { + //傻瓜场景 直接计算 + moneyAll = moneyCurrent + (moneyCurrent * rate * years); + } else { + //真实场景 复利计算 + int count = years / year; + for (int i = 0; i < count; ++i) { + moneyCurrent = moneyCurrent + (moneyCurrent * rate * year); + } + moneyAll = moneyCurrent; + } + + //计算下来3年期定期存款30年总金额翻2番到最初本金3倍 100W本金3年期自动续期30年=321W + ui->txtMoneyAll->setText(QString::number(moneyAll)); +} diff --git a/moneytool/widget.h b/moneytool/widget.h new file mode 100644 index 0000000..aff0891 --- /dev/null +++ b/moneytool/widget.h @@ -0,0 +1,25 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include + +namespace Ui { +class Widget; +} + +class Widget : public QWidget +{ + Q_OBJECT + +public: + explicit Widget(QWidget *parent = 0); + ~Widget(); + +private slots: + void on_btnOk_clicked(); + +private: + Ui::Widget *ui; +}; + +#endif // WIDGET_H diff --git a/moneytool/widget.ui b/moneytool/widget.ui new file mode 100644 index 0000000..24e0224 --- /dev/null +++ b/moneytool/widget.ui @@ -0,0 +1,150 @@ + + + Widget + + + + 0 + 0 + 400 + 300 + + + + 存款计算器 + + + + + 10 + 10 + 381 + 86 + + + + + + + 年限 + + + + + + + 本金 + + + + + + + 0.04125 + + + + + + + 1000000 + + + + + + + 利率 + + + + + + + 期限 + + + + + + + 方式 + + + + + + + 1 + + + + 单利 + + + + + 复利 + + + + + + + + 1 + + + + 1年 + + + + + 3年 + + + + + 5年 + + + + + + + + 30 + + + + + + + + + + 总计 + + + + + + + + 0 + 0 + + + + 计算 + + + + + + + + + + diff --git a/mouseline/widget.cpp b/mouseline/widget.cpp index 76d6211..258a4b0 100644 --- a/mouseline/widget.cpp +++ b/mouseline/widget.cpp @@ -4,9 +4,7 @@ #include "qevent.h" #include "qdebug.h" -Widget::Widget(QWidget *parent) : - QWidget(parent), - ui(new Ui::Widget) +Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setMouseTracking(true); diff --git a/mouseline/widget.ui b/mouseline/widget.ui index 8541684..a613bc4 100644 --- a/mouseline/widget.ui +++ b/mouseline/widget.ui @@ -1,7 +1,8 @@ + Widget - - + + 0 0 @@ -9,12 +10,11 @@ 300 - - Widget + + 鼠标十字线 - - + diff --git a/savelog/savelog.cpp b/savelog/savelog.cpp index 9bcf8c4..f8201ad 100644 --- a/savelog/savelog.cpp +++ b/savelog/savelog.cpp @@ -106,6 +106,12 @@ void SaveLog::save(const QString &content) if (toNet) { emit send(content); } else { + //检查目录是否存在,不存在则先新建 + QDir dir(path); + if (!dir.exists()) { + dir.mkdir(path); + } + //方法改进:之前每次输出日志都打开文件,改成只有当日期改变时才新建和打开文件 QString fileName = QString("%1/%2_log_%3.txt").arg(path).arg(name).arg(QDATE); if (this->fileName != fileName) { diff --git a/savelog/savelog.h b/savelog/savelog.h index 2863582..4c7548f 100644 --- a/savelog/savelog.h +++ b/savelog/savelog.h @@ -44,10 +44,11 @@ private: //日志文件完整名称 QString fileName; -signals: +Q_SIGNALS: + //发送内容信号 void send(const QString &content); -public slots: +public Q_SLOTS: //启动日志服务 void start(); //暂停日志服务 @@ -61,7 +62,6 @@ public slots: void setPath(const QString &path); //设置日志文件名称 void setName(const QString &name); - }; class SendLog : public QObject @@ -74,13 +74,17 @@ public: private: static QScopedPointer self; + + //网络通信对象 QTcpSocket *socket; + //网络监听服务器 QTcpServer *server; private slots: + //新连接到来 void newConnection(); -public slots: +public Q_SLOTS: //发送日志 void send(const QString &content); }; diff --git a/saveruntime/saveruntime.cpp b/saveruntime/saveruntime.cpp index 5bfe6d2..a7e210b 100644 --- a/saveruntime/saveruntime.cpp +++ b/saveruntime/saveruntime.cpp @@ -42,23 +42,6 @@ SaveRunTime::SaveRunTime(QObject *parent) : QObject(parent) connect(timerSave, SIGNAL(timeout()), this, SLOT(saveLog())); } -void SaveRunTime::start() -{ - //开始时间变量必须在这,在部分嵌入式系统上开机后的时间不准确比如是1970,而后会变成1999或者其他时间 - //会在getDiffValue函数执行很久很久 - startTime = QDateTime::currentDateTime(); - timerSave->start(); - - initLog(); - appendLog(); - saveLog(); -} - -void SaveRunTime::stop() -{ - timerSave->stop(); -} - void SaveRunTime::getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute) { qint64 sec = startTime.secsTo(endTime); @@ -86,6 +69,32 @@ void SaveRunTime::getDiffValue(const QDateTime &startTime, const QDateTime &endT } } +void SaveRunTime::start() +{ + //开始时间变量必须在这,在部分嵌入式系统上开机后的时间不准确比如是1970,而后会变成1999或者其他时间 + //会在getDiffValue函数执行很久很久 + startTime = QDateTime::currentDateTime(); + timerSave->start(); + + initLog(); + appendLog(); + saveLog(); +} + +void SaveRunTime::stop() +{ + timerSave->stop(); +} + +void SaveRunTime::newPath() +{ + //检查目录是否存在,不存在则先新建 + QDir dir(path); + if (!dir.exists()) { + dir.mkdir(path); + } +} + void SaveRunTime::initLog() { //判断当前年份的记事本文件是否存在,不存在则新建并且写入标题 @@ -93,6 +102,7 @@ void SaveRunTime::initLog() //幢号 开始时间 结束时间 已运行时间 //1 2016-01-01 12:33:33 2016-02-05 12:12:12 day: 0 hour: 0 minute: 0 + newPath(); logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); @@ -127,6 +137,7 @@ void SaveRunTime::initLog() void SaveRunTime::appendLog() { + newPath(); logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); @@ -150,6 +161,7 @@ void SaveRunTime::appendLog() void SaveRunTime::saveLog() { //每次保存都是将之前的所有文本读取出来,然后替换最后一行即可 + newPath(); logFile = QString("%1/%2_runtime_%3.txt").arg(path).arg(name).arg(QDate::currentDate().year()); QFile file(logFile); @@ -199,16 +211,12 @@ void SaveRunTime::saveLog() void SaveRunTime::setPath(const QString &path) { - if (this->path != path) { - this->path = path; - } + this->path = path; } void SaveRunTime::setName(const QString &name) { - if (this->name != name) { - this->name = name; - } + this->name = name; } void SaveRunTime::setSaveInterval(int saveInterval) diff --git a/saveruntime/saveruntime.h b/saveruntime/saveruntime.h index 5044b45..62225bd 100644 --- a/saveruntime/saveruntime.h +++ b/saveruntime/saveruntime.h @@ -12,6 +12,7 @@ #include #include + class QTimer; #ifdef quc @@ -28,29 +29,47 @@ public: private: static QScopedPointer self; - QString path; //日志文件路径 - QString name; //日志文件名称 + //日志文件路径 + QString path; + //日志文件名称 + QString name; + + //最后的编号 int lastID; + //保存间隔 int saveInterval; + //开始时间 QDateTime startTime; + //日志文件 QString logFile; + //保存文件定时器 QTimer *timerSave; private: + //比较两个时间差值 void getDiffValue(const QDateTime &startTime, const QDateTime &endTime, int &day, int &hour, int &minute); -signals: +public Q_SLOTS: + //启动服务 + void start(); + //停止服务 + void stop(); -public slots: - void start(); //启动服务 - void stop(); //停止服务 - void initLog(); //初始化日志文件 - void appendLog(); //追加一条记录到日志文件 - void saveLog(); //保存运行时间到日志文件 + //新建目录 + void newPath(); + //初始化日志文件 + void initLog(); + //追加一条记录到日志文件 + void appendLog(); + //保存运行时间到日志文件 + void saveLog(); + //设置文件保存目录 void setPath(const QString &path); + //设置文件名称 void setName(const QString &name); + //设置保存间隔 void setSaveInterval(int saveInterval); };