简单做个记录。
需求:因windows10的文件搜索太慢(装系统习惯停用库的功能),所以想弄个方便自己有时搜索的东西。大致架构,os模块处理路径及文件名,sqlite存储及检索,pyside2做图形,最后做完才发现这是假需求(系统文件搜索慢是因为默认搜索文件内容的)。
1、图形设计
以前用过pyqt5,本来想沿用的,使用QTdesigner发现生成的代码是用pyside2的,然后百度一下两者可算是亲兄弟,pyside2是商业用途不用付费的,就用pside2试试了。另设计的软件还有QTcreator,不过这玩意太难配置了,还不如QTdesigner方便,直接到python库里相应目录就可找到,不用费心找,转成py文件也很方便,到相应库路径,用pyside2-uic -o "C:untitled.py" "C:untitled.ui"这样的命令就可生成了,生成的文件直接在后面加上
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = QWidget()
ui = Ui_Form()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
就可以直接使用了,很是方便。
2、pyside2的数据库使用
用QtSql.QSqlDatabase.addDatabase连接sql驱动,使用内存型数据库
self.db = QtSql.QSqlDatabase.addDatabase('QSQLITE', ':memory:')
self.db.open()
self.db.exec_("""create table t1(
id integer primary key autoincrement,
name text,
long_path text
)
""")
对数据库的创建直接用self.db.exec_()执行就可以了,但是如果更新,修改,插入数据有变量的,需用它的专用方式,当然self.db.exec_()用字符拼接也可以。
query = QtSql.QSqlQuery(self.db)
query_str = 'insert into t1 (name,long_path) values (?,?)'
query.prepare(query_str)
query.bindValue(0, x1)
query.bindValue(1, x2)
query.exec_()
首先QtSql.QSqlQuery(self.db)创建QSqlQuery对象,这里要把db对象传过去,然后构建query_str,这里可用习惯的?占位符,也可用:n :p之类的方法占位,然后用prepare方法预处理,再用bindValue方法传入相应位置的信息,最后一定要query.exec_()才正常执行sql语句,每条语句都要query.exec_()一次。
由于sqlite是不支持检索后得出检索数量的,所以query.size方法是-1返回的,如要检索数据数量,可用sqlite的count检索,也可用先query.last()把指针移到检索结果最后条目,然后query.at()+1把当前指针位置再加1就是检索数量了,为不影响后面用query.next()拿数据,还得再用query.first(),query.previous()方法把指针恢复到之前的状态。
数据库搜索,如有变量的,一样需QtSql.QSqlQuery(),预编占位,传递信息,再执行,然后用next方法拿纪录
while quer.next():
quer.value(0)
3、控件的一些设定
下面是用到的listview,radiobutton的一些设定
self.listView.doubleClicked.connect(self.open_select_file) # 设置listview双击事件
self.radioButton.toggled.connect(self.check_key_word_result) # 设置radioButton状态变化事件
self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers) # 设置listView无编辑状态
self.listView.setWordWrap(True) # 设置listView自动换行
listview,tableview有些类似,个人感觉listview轻量,更快一点,tableview好看些。对listview要填数据,需要先把数据填到mode,再对listview应用mode,用起来感觉蛮麻烦的,大家用时再查文档即可。
4、关于路径拼合的问题
使用os.walk,拼接路径时可能出现正反斜杠不规范的情况,可用os.path.normpath(os.path.join(dir,file))这样的方法来规范化路径。
5、编译exe的问题
使用cx_Freeze编译,老提示无法导入shiboken2,然后文件也很大,有几百M。
6、PYQT5与PYSIDE2
把导入包头名由PYSIDE2改为PYQT5,居然直接跑了起来,除了介面略有变化。
7、程序效果图,没做任何美化