Qt视图模型

  • 数据(Data):是实际的数据,如数据库的一个数据表或SQL查询结果,内存中的一个 StringList,或磁盘文件结构等。
  • 视图或视图组件(View):是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引(model index),通过模型索引获取数据,然后为界面组件提供显示数据。Qt 提供一些现成的数据视图组件,如 QListView、QTreeView 和 QTableView 等。
  • 模型或数据模型(Model):与实际数据通信,并为视图组件提供数据接口。它从原始数据提取需要的内容,用于视图组件进行显示和编辑。Qt 中有一些预定义的数据模型,如 QStringListModel 可作为 StringList 的数据模型,QSqlTableModel 可以作为数据库中一个数据表的数据模型。
Read More

PyQt5开发心得

其实大部分的客户端开发都有共通性。一套GUI API,Button、Text、Dialog等等,绘制机制,事件传递机制,都是根据不同平台的特性做了封装。但开发的时候,用法是类似的。而Python由于语法的简易性,开发效率比使用C++版的Qt高很多。所谓的性能损耗其实在大部分的应用中是可以忽略的。

基础结构的搭建

不管是做一个项目还是多个项目,准备一套基础框架,对开发效率是非常有帮助的。这个基础框架通常包括:

  • 基础结构
    基础工具类、工具函数:字符串处理、时间处理、日期处理、线程处理、网络请求、拖拽工具、缩放工具、资源下载工具、
    基础控件:弹窗提示、确认框、webview的封装和通讯模块、loading框、全局样式处理
    日志工具:
    数据模拟工具:mock
    单元测试框架:
    性能分析工具:分析代码质量
  • 打包工具:分发安装包
Read More

异步编程

isolate机制

Dart是单线程模型,它的并发机制叫isolate。APP的启动入口main函数就是一个类似Android主线程的一个主isolate。和Java的Thread不同的是,Dart中的isolate无法共享内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

// 导入isolate包
import 'dart:isolate';

// 使用async关键词将main函数标记为一个异步函数,这样才能使用await关键词
void main() async {
// 使用await关键词等待任务执行完成
await Isolate.spawn<String>(subTask, "Task1 parameter");

// main函数结束标记
print("main func end.");
}

// Isolate入口函数定义,接受一个String参数
void subTask(String msg) {
print("subTask recv: $msg");
}

消息机制

Dart在执行完main函数后,就会由Loop开始执行两个任务队列中的Event。首先Loop检查微服务队列,依次执行Event,当微服务队列执行完后,就检查Event queue队列依次执行,
在执行Event queue的过程中,每执行完一个Event就再检查一次微服务队列。所以微服务队列优先级高,可以利用微服务进行插队。

Future

在 Dart 库中随处可见 Future 对象,通常异步函数返回的对象就是一个 Future。 当一个 future 执行完后,他里面的值就可以使用了,可以使用then()来在future完成的时候执行其他代码。Future对象其实就代表了在事件队列中的一个事件的结果。

Read More

消息机制

概述

Dart在执行完main函数后,就会由Loop开始执行两个任务队列中的Event。首先Loop检查微服务队列,依次执行Event,当微服务队列执行完后,就检查Event queue队列依次执行,在执行Event queue的过程中,没执行完一个Event就再检查一次微服务队列。所以微服务队列优先级高,可以利用微服务进行插队。

  • event队列:包含所有外来的事件:I/O,mouse events,drawing events,timers,isolate之间的message等。

  • microtask队列:在Dart中是必要的,因为有时候事件处理想要在稍后完成一些任务但又希望是在执行下一个事件消息之前。

Read More