PyQt项目实战-工作小助手(4 利用QSqlTableModel和tableView 实现Todolist)
本部分通过QSqlTableModel和tableView控件实现todolist工作待办的查询、新增、修改、删除和导出功能
文章目录
1、界面设计
界面支持筛选查询、新增、删除和导出功能。先上图。
- 第一行为筛选查询字段,实现查询功能:
日期范围为comboBox,预设为全部、本日、本周、上周、本月、上月、本年、本年之前。
程度为comboBox,根据重要和紧急程度分为:
- 重要紧急,该部分任务优先处理
- 不重要紧急,次之
- 重要不紧急,再次之
- 不重要不紧急 ,最后处理
事项为lineEdit,支持通过输入文本模糊匹配查询。
- 第二行为tableview控件,展示查询结果和支持直接修改数据库。
- 第三行为toolButton,分别实现新增记录、删除记录和导出任务功能。
2、实现todolist查询
- 新建QSqlTableModel实例todomodel。QSqlTableModel类提供了一个可读写单张SQL表的可编辑数据模型。支持修改,插入,删除,查询,和排序。EditStrategy使用OnFiledChange策略实现编辑功能。
self.todomodel = QSqlTableModel()
self.todomodel.setTable("todolist") self.todomodel.setEditStrategy(QSqlTableModel.OnFieldChange)
setEditStrategy各取值含义如下:
QSqlTableModel.OnFieldChange,一改动马上提交数据库
QSqlTableModel.OnRowChange,当前行号变化再提交数据库
QSqlTableModel.OnManualSubmit,默认值,手动提交submitAll()修改才生效。
- 默认情况下,QSqlTableModel查询返回所有记录。可通过setFilter()实现sql中where语句的功能,即设置查询过滤条件。查询条件要转化为Sqlite3数据库所能识别的过滤语句,特别是要处理各类日期字典。
本日:date(pdate) = date(‘now’)
本周:date(pdate) >= date(‘now’,‘weekday 1’,’-7 day’))
上周:(date(pdate) >= date(‘now’,‘weekday 1’,’-14 day’) and date(pdate) < date(‘now’,‘weekday 1’,’-7 day’))
本月:(date(pdate) >= date(‘now’,‘start of month’))
上月:(date(pdate) >= date(‘now’,‘start of month’,’-1 month’) and date(pdate) < date(‘now’,‘start of month’))
本年:(date(pdate) >= date(‘now’,‘start of year’))
本年以前:(date(pdate) < date(‘now’,‘start of year’))
# 2、业务条件转换为查询过滤语句。
##2.1文本模糊匹配
sql1 = "(content like '%{}%')".format(scontent)
filterlist = sql1
##2.2待办事项建立日期范围。
if sdaterange in [1, 2, 3, 4, 5, 6, 7]:
if sdaterange == 1: # 本日
sql2 = "(date(pdate) = date('now'))"
elif sdaterange == 2: # 本周
sql2 = "(date(pdate) >= date('now','weekday 1','-7 day'))"
elif sdaterange == 3: # 上周
sql2 = "(date(pdate) >= date('now','weekday 1','-14 day') and date(pdate) < date('now','weekday 1','-7 day'))"
elif sdaterange == 4: # 本月
sql2 = "(date(pdate) >= date('now','start of month'))"
elif sdaterange == 5: # 上月
sql2 = "(date(pdate) >= date('now','start of month','-1 month') and date(pdate) < date('now','start of month'))"
elif sdaterange == 6: # 本年
sql2 = "(date(pdate) >= date('now','start of year'))"
elif sdaterange == 7: # 去年及以前
sql2 = "(date(pdate) < date('now','start of year'))"
filterlist = filterlist + " and " + sql2
else:
sql2 = ''
##2.3待办事项状态。
if sfinstatus in [1, 2]:
sql3 = "(finstatus={})".format(sfinstatus)
filterlist = filterlist + " and " + sql3
else:
sql3 = ''
##2.4待办事项分类条件。
if scatalog in [1, 2, 3, 4]:
sql4 = "(catalog={})".format