番茄钟软件
1.为什么想写这个软件
因为之前本人一直在用pyqt开发小的软件,实现python爬虫的视频资源搜索的程序ui。
在其中,发现了很多的样式开发的问题,从qcompleter,qtablewidget的问题,以及软件整体臃肿、遇到问题寻找资料困难的问题。
所以,我转向了基于c++的qt。
因为学了,所以想写一个小程序试试水。
而之前一直在用的一个番茄钟是steam里免费的chill drive,如图。
这是一个很优秀的番茄钟软件,可以计时,听歌,还有很优秀的背景画面。
但由于本人经常用电脑工作,像这样全屏的应用并不适合。
所以一拍即合,我写了一个桌面挂件式的番茄钟。 并在这里,留下一些足迹。
2.创作中实现的关键功能以及一些小技巧
整体使用了qt creater完成代码编写。
图标资源获取
我目前用下来最棒的图标网站,全部可使用svg格式,自定义大小。
https://yesicon.app/bi
同时,ico文件可以从svg转换,网址如下。
https://www.aconvert.com/cn/icon/svg-to-ico/
实现无边框
无边框界面是让qt程序变好看的第一步。
这里我参考的是github开源的qt无边框实现。
大概分为三步。
第一、改成透明背景,以及无边框
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint|this->windowFlags());
第二、改写窗口的四个函数,实现背景的样式以及软件拖动效果。
void mousePressEvent(QMouseEvent*event) override;
void mouseMoveEvent(QMouseEvent*event) override;
void mouseReleaseEvent(QMouseEvent*event) override;
void paintEvent(QPaintEvent * event) override;
第三、实现新的放大、缩小、关闭的效果。
void closeEvent(QCloseEvent *event) override;
这里我并没有实现拖动大小的功能的方法,并且在本软件中没太大必要,所以暂且搁置。
设置界面ui实现
运用了Qdialog实现。
背景音乐功能
本人是喜欢在工作时听音乐的,所以用了qt自带的music模块。
点击文件夹图标,即可进入对应的音乐文件夹,往文件夹里自行添加音乐即可。
由于本人不希望这个番茄钟功能冗余,所以并不打算加上音乐播放器的功能。
倒计时功能
这个功能运用了QTimer模块。
这个模块完美的实现了多线程和计时效果,所以这个最关键的功能反而很简单。
敏感步骤的提示
这里采用的QMessageBox。
动画效果的按钮实现
像这种动画效果的按钮,一般是构造成一个类,对QWidget进行提升。
提前准备好三个样式的按钮图标。
分别在触摸,点击,离开三个时间段转换图标并update即可。
class eventColorButton : public QWidget
{
Q_OBJECT
private:
QPixmap pic;
QString leavepic;//这里保存按钮图标的地址
QString enterpic;
QString presspic;
QString releasepic;
public:
explicit eventColorButton(QWidget *parent = nullptr);
void mousePressEvent(QMouseEvent *event) override;//实现鼠标后的按钮图标转换
void mouseReleaseEvent(QMouseEvent *event) override;//鼠标释放的时候,触发clicked信号
void leaveEvent(QEvent *event) override;//实现鼠标离开时按钮图标转换
void enterEvent(QEvent *event) override;//实现鼠标进入时按钮图标转换
void paintEvent(QPaintEvent *event) override;//实现按钮图标初始化
void initializePixmaps(QString leavePixmapPath, QString enterPixmapPath,QString pressPixmapPath);
signals:
void clicked();//鼠标点击后的信号
};
3. 软件当前存在的一些已知bug
不同显示器不适配的问题
因为qt的dpi适配问题,目前在不同显示屏上软件显示的效果可能存在不同。
我这里并没有用qt自带的高dpi自适应,因为这会引起放大后图标清晰度降低的问题。
受限于本人能力,以下是我给的解决方法:
// 获取当前屏幕分辨率
QSize screenSize = screen->size();
int screenWidth = screenSize.width();
int screenHeight = screenSize.height();
int width,height;
width=430;
height=150;
QString currentDirPath = QCoreApplication::applicationDirPath();
QFile file(currentDirPath + QDir::separator() + ".txt");
if (!file.exists()) {
if (file.open(QIODevice::WriteOnly)) {
QTextStream out(&file);
out << "430 150";
file.close();
}
}else{
if (file.open(QIODevice::ReadOnly)) {
QTextStream in(&file);
QString line = in.readLine();
file.close();
QStringList numbers = line.split(' ');
width = numbers.at(0).toInt();
height = numbers.at(1).toInt();
};
};
if (screenWidth == 2560) {
w.resize(width, height);
}else{
int dpiw = width*screenWidth/2560;
int dpih = height*screenWidth/2560;
w.resize(dpiw,dpih);
}
软件会获得当前屏幕的分辨率,然后等比例改变整个软件的大小。
当然不排除某些显示屏的大小不匹配,造成一些尺寸问题。
我这里将窗口默认尺寸放在了文件tomatoBellSize.txt
中。
这个文件会在打开一次exe文件后的exe文件的同目录下自动生成。
保持格式修改这个文件里的两个数字即可。
或者使用源码的人也可以自行更改这个默认尺寸430,150到合适的大小。
背景音乐添加问题
背景音乐只给了两种格式权限:mp3和wav。
白噪音只给了一种格式权限:mp3。
如果是其它格式,得自行转换,或者修改源码。
4.源码分享以及打包的app链接
是windows系统的,其它的系统本人没试过。
软件使用了NSIS做成安装包,使用方法可见隔壁的大佬的NSIS安装包教程。
源码在GitHub
https://github.com/5Wxx/Qt-Project1
安装包在百度网盘
通过百度网盘分享的文件:TomatoBellSetup.exe
链接:https://pan.baidu.com/s/1QGVPnGhxhM-LqhPJavL6cg?pwd=d11t
提取码:d11t