使用PyQt5从零进行大数据app构建(十)从UI分离耗时业务到子线程,数据库交互模式与sql异常捕获

前言:想写一个应用好久了,独立开发大概是每个程序员的梦想。自从之前写了一个数据挖掘的小模型,一直想封装一下,故而上路,所以此系列算不上教程,只是记录分享这个过程的坑点和经验,力求有头有尾,网上抄来抄去的教程真的看的头疼,己所不欲勿施于人,在封装完毕之后我会将完整的代码贴出来与大家分享。

教程合集地址:https://blog.csdn.net/infent/column/info/30927

这一节主要实现了数据库交互模式,设计到两个比较耗时的操作,一个是query查询,一个是表单内容循环填充,每次进行这两个内容的时候,ui界面都会阻塞,从而显示未响应。因此需要使用QThread来将这两部分的逻辑分离出来。

接下来是分析线程中的业务逻辑该怎么写了,之前我把界面展示也放在线程里结果一直不展示界面,后来把计算结果返回给展示界面,这块还要搞清楚。

最终实现的效果如上,如果再友好一点,可以再设置进度条,这个在后面的会实现。

其次我仍然是使用QTableWeight进行的展示,但是Qt有一个QSqlTableModel可以更便捷的展示和操作界面,结合表指定和多线程应该能更方便一些。

在PyQt5快速开发实践中的9.24小节有一个展示的例子,如果要迭代开发的话,我的可视化操作可能考虑想这个例子靠拢,废除手动sql填写,因为这样不够健壮,一旦sql写错了就有可能导致程序退出,这一点通过使用try,except,finally语句包裹处理流程可以处理,对于错误的sql语句,我们在后台输出错误并释放执行按钮。

 

还剩下模型更新模块和进度条使用,争取这周搞完吧!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT5 中,可以使用 `QThread` 类来创建子线程。在子线程中,可以使用信号与槽机制来与主线程进行通信。 以下是一个示例代码,演示了如何在主线程和子线程之间交换图片数据: ```python from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QImage from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout import time class ImageThread(QThread): # 定义一个信号,用于传递图片数据 image_data = pyqtSignal(QImage) def __init__(self, parent=None): super(ImageThread, self).__init__(parent) def run(self): # 模拟耗时操作 time.sleep(5) # 加载图片 image = QImage('image.jpg') # 发送信号,传递图片数据 self.image_data.emit(image) class MainWindow(QWidget): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # 创建标签,用于显示图片 self.label = QLabel(self) self.label.setAlignment(Qt.AlignCenter) self.label.setText('Loading image...') # 创建布局,并将标签添加到布局中 layout = QVBoxLayout(self) layout.addWidget(self.label) # 创建子线程,并将信号与槽连接起来 self.thread = ImageThread(self) self.thread.image_data.connect(self.show_image) # 启动子线程 self.thread.start() def show_image(self, image): # 在标签中显示图片 self.label.setPixmap(QPixmap.fromImage(image)) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在上面的代码中,我们创建了一个 `ImageThread` 类,继承自 `QThread` 类。在 `run()` 方法中,我们模拟了一个耗时的操作,并加载了一张图片。然后,我们通过 `image_data` 信号,将图片数据传递给主线程。 在 `MainWindow` 类中,我们创建了一个标签,用于显示图片。然后,我们创建了一个 `ImageThread` 对象,并将其 `image_data` 信号与 `show_image()` 槽连接起来。最后,我们启动了子线程,并在 `show_image()` 方法中将图片显示在标签中。 注意,由于 `QImage` 和 `QPixmap` 在不同的线程之间传递时可能会出现问题,因此我们在 `show_image()` 方法中使用了 `QPixmap.fromImage()` 方法将图片转换为 `QPixmap` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值