PyQt实现类似音速启动的GUI程序

之前一直在用音速启动,就是一个快速打开文件夹和文件的软件

然后听说是流氓软件(其实自己也发现它会篡改主页),再加上最近想顺路学一把PyQt,就打算自己写一个,遂决定删掉。

然后觉得名字起的不够霸气,遂把自己写的命名为光速启动

#我逗比的一面又显现出来了

#另:考完试终于可以愉快的写代码了

#还有就是各位大神如果觉得我的写法(实现)naive,非常欢迎在下面吐槽,我非常期待您们的意见

于是就开始干:

主类mainWin

打算实现的功能:
1.添加文件和文件夹,按钮形式,可拖放添加,也可删除,也可右键菜单添加
2.关闭时退至托盘,右键选择显示窗口或退出
3.实现靠屏幕右侧悬停

1.
添加文件和文件夹,我最基本的是右键弹出菜单,用contextMenu来实现

把ContextMenuPolicy的值设置为Qt.CustomContextMenu,响应customContextMenuRequested()这个signal,在响应的槽中把菜单显示出来。

添加的都保存在一个文件,以便下次启动也可以显示这次的改动,启动时候把所有的按钮存在list里,方便打开时找到sender、删除时重新布局等等

删除使用对话框,用ComboBox选择删除的项目,再把其删除

删除倒是一件麻烦的事,一开始查了class reference,用removeWidget发现不得要领,后来在关于layout里删除Widget的问题中发现一个方法,先setParent(None),再removeWidget。再回头看看觉得也对,removeWidget使用后布局是我的锅,因为它还属于原来的QWidget。下面摘抄自class reference:

QLayout.removeWidget (self, QWidget w)

Removes the widget widget from the layout. After this call, it is the caller’s responsibility to give the widget a reasonable geometry or to put the widget back into a layout.

 

Note: The ownership of widget remains the same as when it was added.
如果我先把它变成孤儿(setParent(None)),就不用处理了。成功删掉后再把保存数据的文件改一下,重新布局就解决删除这个问题。

后来发现QPushButton这样直接搞太丑了,就决定加一波图片,对应各种文件格式,文件夹对应文件夹。然后一查发现还可以用QSS(好多CSS都能用,选择器、伪类)也是醉了。。。直接background-image:url(url)搞定。

其实我想直接获得系统默认图标的,但是也查不到怎么搞,所以知道的大牛能不能给我说一下,谢谢啦

所以我就去网上找了一组图标用。。。还特别丑。。。

关于对话框和删除对话框都是用QDialog直接搞出来,比较简单

拖放的话直接重写dragEnterEvent和dropEvent,对于文件就用mimeData().hasUrls()判断是不是合法url列表,如果是再使用mimeData().urls()访问url列表
剩下就简单了,和添加是一样的。还要注意setAcceptDrops(True)和在拖动合法url列表时使用acceptProposedAction(),以表明只接受文件的拖动

打开的话,呃,直接使用os.startfile()

2.
关闭时不关闭退至托盘,考虑重写closeEvent,再event.ignore(),再把托盘图标设为可见,托盘图标用QSystemTrayIcon()实现,可以把菜单加到QSystemTrayIcon().trayIconMenu上

3.
悬停的话用的是重写enterevent,leaveEvent

在窗口的右边界坐标,即self.x() + self.frameGeometry().width()超过屏幕右边界坐标时,把窗口右边界移动到屏幕右边界附近,离开时再把窗口移到右边探出一小点,以便鼠标得以再次进入

不过坑爹之处在于QWidget是由两部分组成,title bar和frame。enterevent,leaveEvent是在frame内部才算enter,出去(包括把鼠标移到title上)都属于leave。这样的话一旦悬停就很难移动窗口,所以我就用mousePressEvent和mouseMoveEvent加了左键点击frame拖动也可以移动窗口,这样就比较方便。所以先要event.buttons == PyQt4.Qt.Qt.LeftButton确认左键,再移动

用的网格布局,窗口太长时候上下两行间距过大,暂时不知道怎么调整。。。比较丑。。。

代码已经放到同性交友网站上了,传送门:https://github.com/eipi10ydz/gsqd,欢迎去看看

而且还没有做打包exe,现在就用bat生成快捷方式放在桌面打开,用快捷方式可以改图标,看起来还可以接受

就这样吧,注册这么久第一次发博文,记录一下写的大概思路,方便以后查阅。