最近突然觉得桌面图表过多特别心烦,所以就上网找了找快速启动的软件,最后是找到一个叫音速启动的软件,开始用着还行,但是发现用火狐浏览器时,鼠标中键是关闭标签,而鼠标中键也是音速启动显示面板的快捷键,所以就会冲突,其实这也没什么,无非就是进设置里把快捷键关了呗,但是当我点音速启动的“设置“选项时,竟然没有反映,是的,没有反应(事后有人跟我说在他的电脑上不会出现这种情况,我也没再次验证),于是乎就萌发了自己写一个快捷方式面板的软件(QuickPanel)
现在,程序已经算是开发完了(已经在用,时不时的添加些小功能),美工是本人,且本人是菜鸟,所以功能实现了以后也就没有纠结于界面。
在这里总结一下开发过程中遇到的问题。
首先,虽说用的是Qt但是还是使用了windows api所以跨平台什么的就灰飞烟灭了。
1.一开始是打算只弄快捷方式,后来想想,还是弄个所有文件以默认方式打开为好,所以就用到了shellexecute这个api
使用windows api要包含头文件#include <Windows.h> #include <shellapi.h>并且#pragma comment(lib,"shell32.lib")来链接库,其实这一个函数就是整个程序的核心功能实现了
2.程序使用QList来存储栏目标签和每个栏目里的图标的,但是如果QList<myButton> buttonList这种调用的话,是不行的,会报错如下图,以为没有重载复制函数,所以我的解决方式是QList<myButton*> buttonList使用指针的List。
3.关于信号与槽的连接问题,之前一直以为只要connect就好了,从未考虑过disconnect的问题,以至于一直想不通为什么会点一次快捷方式弹出n多窗口,这次终于明白connect几次就会有几次槽响应,所以一定要记得disconnect后再connect
4.还有一个小技巧就是防止双击事件影响单击事件的代码其实很容易,只要一个定时器
timer=newQTimer(this);
timer->setSingleShot(true);
connect(timer,SIGNAL(timeout()),this,SLOT(isSingleClick()));
voidWidget::iconActived(QSystemTrayIcon::ActivationReasonr)
{
switch(r){
caseQSystemTrayIcon::Trigger:
timer->start(qApp->doubleClickInterval());
trayCurPos=cursor().pos();
break;
caseQSystemTrayIcon::DoubleClick:
timer->stop();
your code to do
break;
}
voidWidget::isSingleClick()
{
initTrayIconMenu();
if(menu->isHidden())
menu->exec(trayCurPos);
else
menu->hide();
}
5.再有就是再编译是总有莫名奇妙的错误,其实有可能是修改了资源文件或者其他文件忘记保存,或者保存但是qrc还没编译,所以遇到此类不明所以的问题可以先试试qmake一下,看看还有没有错误,也许揪心的错误就这么解决了6.要记得,以管理员权限运行的程序是无法拖拽进图标的7.其实一开始模仿qq的自动停靠隐藏还是费了不小的力气的,但是现在看起来很简单,也就是判断坐标然后一点点的移动(弹出或者缩进去隐藏),代码很容易懂。就不多说了。8.到现在也没弄懂如何获取lnk文件的参数(使用Qt),希望以后能解决。自己做的东西肯定不及网上已有的软件好,但是已经能满足我自己日常的使用了,而且也没有乱七八糟的东西影响,自己写的还是很纯净的程序。最后附上源码及exe(点击打开链接),源码比较烂,注释不太多,还希望与大家交流一下,很期待有人批评指导。