当前位置: 首页 > news >正文

汽车网站建设工作室房屋装修设计网站

汽车网站建设工作室,房屋装修设计网站,wordpress rss 爬取,网站title 在哪里设置需求 开发软件的时候不可避免要和数据库发生交互#xff0c;但是有些 SQL 请求非常耗时#xff0c;如果在主线程中发送请求#xff0c;可能会造成界面卡顿。这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单#xff0c;且不会阻塞界面的异步请求方法。 实…需求 开发软件的时候不可避免要和数据库发生交互但是有些 SQL 请求非常耗时如果在主线程中发送请求可能会造成界面卡顿。这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单且不会阻塞界面的异步请求方法。 实现过程 在实现异步请求之前需要先明确一下函数签名 def sqlRequest(service: str, method: str, slot, params: dict None )各个参数的解释如下 service: 业务名method: 接口名slot: 拿到数据后调用的回调函数params: 请求参数 总体流程如下图所示包括子界面发送请求、数据库线程处理请求、主界面调用回调函数来消费响应结果三个步骤。 信号总线 在 Qt 中子线程无法直接更新主界面只能发送信号通知主线程然后在主线程中更新界面。在之前的博客《如何在 pyqt 中实现全局事件总线》介绍了信号总线的使用通过引入信号总线可实现任意层级的组件之间的通信。 本文的信号总线只含有两个信号一个用来请求数据一个用来消费数据 class SignalBus(QObject): Signal bus fetchDataSig Signal(SqlRequest) # 请求数据信号dataFetched Signal(SqlResponse) # 响应数据信号signalBus SignalBus()class SqlRequest: Sql request def __init__(self, service: str, method: str, slotNone, params: dict None):self.service serviceself.method methodself.slot slotself.params params or {}class SqlResponse: Sql response def __init__(self, data, slot):self.slot slotself.data data发送请求 子界面中通过调用 sqlRequest() 函数来发起异步 SQL 请求该函数只是将参数封装为 SqlRequest 对象然后通过 signalBus 的 fetchDataSig 信号发送给数据库子线程 def sqlRequest(service: str, method: str, slotNone, params: dict None): query sql from database request SqlRequest(service, method, slot, params)signalBus.fetchDataSig.emit(request)比如下图中商品类型下拉框的数据就来自于数据库 在组件 LicenseCard 中使用下述代码就能完成数据的请求和消费组件库参见 https://qfluentwidgets.com/zh/ from qfluentwidgets import HeaderCardWidget, ComboBoxclass LicenseCard(HeaderCardWidget):def __init__(self, parentNone):super().__init__(许可证, parent)self.goodsComboBox ComboBox(self)# 请求商品信息sqlRequest(goodsService, listAll, lambda i: self.onGoodsFetched(i))def onGoodsFetched(self, goods: List[Goods]): 将商品信息添加到下拉框中 for good in goods:self.goodsComboBox.addItem(good.name, userDatagood)处理请求 子线程 DatabaseThread 中维护着一个请求队列 tasks每当收到信号总线的 fetchDataSig 信号时就会使用反射机制将请求中携带的 service 和 method 字符串转换为数据库业务类的方法指针并将这个指针添加到队列中等待调用。调用方法返回的数据会被封装为 SqlResponse 对象接着通过信号总线发送给主界面。 class DatabaseThread(QThread): Database thread def __init__(self, db: QSqlDatabase None, parentNone):super().__init__(parentparent)self.database Database(db, self)self.tasks deque()# 处理请求信号signalBus.fetchDataSig.connect(self.onFetchData)def run(self): 处理请求 while self.tasks:task, request self.tasks.popleft()result task(**request.params)signalBus.dataFetched.emit(SqlResponse(result, request.slot))def onFetchData(self, request: SqlRequest): 将请求添加到队列中 service getattr(self.database, request.service)task getattr(service, request.method)self.tasks.append((task, request))if not self.isRunning():self.start()class Database(QObject): Database def __init__(self, db: QSqlDatabase None, parentNone):super().__init__(parentparent)self.orderService OrderService(db)self.userService UserService(db)self.goodsService GoodsService(db)处理响应结果 主界面中只需将信号总线的 dataFetched 信号连接槽函数然后在槽函数中对取出 response 对象中的数据并调用回调函数来消费数据即可 from qfluentwidgets import MSFluentWindowclass MainWindow(MSFluentWindow): 主界面 def __init__(self):super().__init__()# 处理响应结果signalBus.dataFetched.connect(self.onDataFetched)def onDataFetched(self, response: SqlResponse):if response.slot:response.slot(response.data)总结 在这篇博客中我们使用子线程和信号总线完成了异步数据库请求操作界面所使用的组件全部来自于 https://qfluentwidgets.com/zh/ 以上~~
http://www.sadfv.cn/news/130153/

相关文章:

  • html5 网站布局应用教程公司做一个网站如何定位
  • 买网站源码的网站网站建设案例 算命网站
  • 上海网站设计团队怎么查网站icp备案
  • 美食网站建设页面要求做网站用的字体
  • 信息网站建设汇报wordpress提交360
  • 做企业英语网站要注意哪些百度的营销中心上班怎么样
  • 广州越秀区租房温岭新站seo
  • seo网站推广的主要目的是什么微信开发商
  • 上海各区的网站有哪些公司深圳网站建设软件开发公司
  • 网站制作设计专业公司广州网站建设公司网络安全优化
  • 网站开发语言 知乎温州市名城建设集团有限公司网站
  • 登封市城乡建设路网站社群网站建设
  • 企业网站建设的文章广州网站推广服务商
  • 管家婆免费资料网站电销精准客户数据资源
  • 绍兴网站制作软件网络技术挑战赛
  • 网站被百度收录很重要建站之星服务器
  • 自己做黑彩网站常州免费做网站
  • 江门网站平台建设一个网站怎么做软件
  • 做网站推广 seo的移动端英文简称
  • 前端静态网站模板下载伊春网络建站公司
  • 营口汽车网站建设wordpress 升级后 插件
  • 购物网站 服务器 带宽 多大电商平台业务流程图
  • 常州做网站哪家便宜大理网站建设网站建设
  • 临淄关键词网站优化哪家好网站建设更改
  • 制作网站 公司简介2345网址导航下载桌面
  • 国度网络网站建设做官网需要多少钱
  • 公司网站宣传设计方案福田庆三眼睛案例图片
  • 网站开发网页设计游戏设计html网站怎么搭建
  • 贵阳专业网站建设贵阳做网站软件
  • 网站域名到期会怎么样天推广人的网站