首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何构造大型pyqt5图形用户界面而不使用QThread子类化和使用QPushButtons来执行长时间运行的任务

构造大型PyQt5图形用户界面时,可以使用以下方法来执行长时间运行的任务,而不需要使用QThread子类化和QPushButtons:

  1. 使用QRunnable和QThreadPool:QRunnable是一个可执行的任务对象,它可以在QThreadPool中运行。通过创建一个自定义的QRunnable类,你可以将长时间运行的任务封装在其中。然后,使用QThreadPool来管理和调度这些任务的执行。这种方法可以避免直接操作线程,而是将任务提交给线程池进行处理。你可以使用QThreadPool的start()方法来启动任务的执行。
  2. 使用Qt的信号和槽机制:长时间运行的任务可以在后台线程中执行,然后通过信号和槽机制与主线程进行通信。在主线程中,你可以定义一个槽函数来处理任务完成的信号,并更新图形用户界面。通过这种方式,你可以保持图形用户界面的响应性,同时执行长时间运行的任务。
  3. 使用QTimer:如果任务可以分解为多个较小的步骤,并且可以在每个步骤之间进行一些图形用户界面的更新,那么可以使用QTimer来定期触发任务的执行。在每个定时器事件中,执行一个小的任务步骤,并更新图形用户界面。这样可以避免长时间运行的任务阻塞主线程。
  4. 使用异步编程:使用Python的asyncio库或Qt的QEventLoop,可以实现异步编程模式。通过将长时间运行的任务转换为协程或异步函数,并使用await关键字来等待任务完成,可以在不阻塞主线程的情况下执行任务。这种方法可以提高应用程序的并发性能,并保持图形用户界面的响应性。

总结起来,构造大型PyQt5图形用户界面时,可以使用QRunnable和QThreadPool、信号和槽机制、QTimer或异步编程来执行长时间运行的任务。这些方法可以帮助你在不使用QThread子类化和QPushButtons的情况下,实现图形用户界面的响应性和长时间任务的执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Qt】Qt线程(两种QThread详细使用方式)「建议收藏」

QObject是基于QTimer、QTcpSocket、QUdpSocketQProcess之类图形用户界面的子类。 基于非图形用户界面的子类可以无线程操作。单一类运行某功能时,可以不需要线程。...总之,只有在绝对必要时使用此函数。 void requestInterruption() 请求线程中断。该请求是咨询意见并且取决于线程上运行代码,决定是否及如何执行这样请求。...可以使用requestInterruption()请求中断。 //此函数可用于使长时间运行任务干净地中断。从不检查或作用于该函数返回值是安全,但是建议在长时间运行函数中经常这样做。...如果在自定义线程类中定义相关槽函数,那么这些槽函数不会由子类化QThread自身事件循环所执行,而是由该线程拥有者所在线程(一般都是主线程)执行。...事实的确是如此,子类化QThread只能执行run()函数中任务直到run()函数退出,槽函数根本不会被自己线程执行

7.6K21

Qt高并发

此外,可以在主线程中长期运行循环调用QApplication::processEvents(),以使执行工作时图形用户界面可以保持响应。...它们允许访问动画代码中GUI对象而且不会妨碍图形用户界面的响应。...一些程序通过改变QThread定义使它可表示其管理线程并在该线程内执行执行槽。这些程序使用一种变通方法:在QThread构造函数中使用moveToThread(this)。...另外一种让代码在单独线程内运行方法是子类化QThread并重新实现run()函数。...当子类化QThread时,记住构造函数是在旧线程中执行run()函数是在新线程中执行。如果一个成员变量被两个函数访问,那么变量是被两个不同线程访问。这时得检查这样做是否安全。

1.5K20
  • 深入思考 PyQt 多线程处理

    多线程本来就是用来任务协作并发,如果你使用强制手段干掉线程,那么会有很大概率会出现意想不到 bug。请记住:锁资源不会因为线程退出被释放 !...线程通过 start 方法启动运行。 started finished 表示是线程开始运行信号以及运行完毕信号,既然是信号,如有需要,连到槽函数中即可。...3.1 没有长时间等待情况 当线程代码中没有死循环或长时间等待情况时,这就非常好办了,直接使用 exit( ) 或 quit( ) 方法即可,等代码执行完再退出 exec( ) 循环结束线程...,这种方法既简单又安全,就算要等,也只是等一会时间,用户几根感觉不到,顶多就界面卡一两秒。...Qt 自带 QThread 类为我们提供了许多非常接口,但其实它也不是完全安全可靠,一切可靠性程序都应该由程序员自主判断设计,针对不同需求,应该根据实际情况选择最优解决方案,不是一味追求通用忽略了用户体验或数据安全

    7.6K60

    QThread用法

    在Qt中建立线程主要目的就是为了用线程来处理那些耗时后台操作,从而让主界面能及时响应用户请求操作。...在要使用线程controller类中,新建一个QThread对象woker类对象,使用moveToThread()方法将worker对象事件循环全部交由QThread对象处理。...相比于子类化QThread只能执行run()函数中任务,moveToThread方法中一个线程可以做很多不同工作(只要发出任务对应信号即可)。...如果在自定义线程类中定义相关槽函数,那么这些槽函数不会由子类化QThread自身事件循环所执行,而是由该线程拥有者所在线程(一般都是主线程)执行。...事实的确是如此,子类化QThread只能执行run()函数中任务直到run()函数退出,槽函数根本不会被自己线程执行

    86420

    qt多线程编程实例_lgbt

    void requestInterruption() 请求线程中断。请求是咨询意见并且取决于线程上运行代码,决定是否及如何执行这样请求。...,要在另外一个线程中调用一个槽函数(或任何invokable方法),需要将调用槽函数放置在目标线程事件循环中,让目标线程在槽函数开始运行之前,先完成自己的当前任务原来线程继续并行运行。...使用场合: 线程生命期不可控,需要长时间运行于后台线程。...A、子类化 QThread B、重写run 使其调用 QThread::exec() ,开启线程事件循环 C、为子类定义信号槽,由于槽函数并不会在新开 Thread 运行,在构造函数中调用...线程更新界面状态本质是线程发送信号通知主线程界面更新请求,主线程根据具体信号以及信号参数对界面组件进行修改。 使用信号槽在线程中更新主界面中进度条进度显示信息。

    1.5K10

    python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    在做界面开发时,无论是移动端Android,还是我们这里讲PyQt5,经常会有一个界面开发准则,那就是UI主线程与耗时线程一定要分开,主线程负责刷新界面,耗时操作,如网络交互、磁盘IO等,都应该放在线程里执行...,它们各司其职,保证系统正常运行,提升整体用户体验。...time.sleep(20)模拟耗时任务执行python main.py后一会,界面就会出现无响应,假死现象,等到20秒过后,界面又恢复了正常,用户体验非常差。....QtCore import QThread, pyqtSignal class WorkThread(QThread): # 使用信号UI主线程通讯,参数是发送信号时附带参数数据类型,可以是str...pyqtSignal,我们使用跟UI主线程通讯,一般用于界面元素刷新,在线程最后,我们发送这个信号。

    1.3K41

    翻译 | 您没有做错(线程)

    Brad在他博客文章中解释说,他看到许多用户通过对QThread进行子类化,在该子类中添加一些槽并在构造函数中执行以下操作滥用QThread: moveToThread(this);   他们把线程移动到自己类内...在Qt 5.0Qt 4.8.4中,更改了QThread文档,因此示例代码涉及子类。查看Qt 4.8 QThread文档第一个代码示例(更新文档已经修复)。...它具有许多样板行,仅用于在线程中运行一些代码。而且甚至存在泄漏:QThread永远不会退出并被销毁。   我在IRC上被问到一个用户问题,该用户遵循该示例,以便在线程中运行一些简单代码。...我已经向文档提交了补丁, 以免再次阻止对QThread类化。 经验法则 ---- 什么时候子类化,什么时候类化? 如果您确实不需要线程中事件循环,则应该子类化。...如果需要事件循环并处理线程中信号槽,则可能不需要子类化。 改用QtConcurrent呢?   QThread级别很低,您最好使用更高级别的API,例如QtConcurrent。

    62610

    Python Qt GUI设计:多线程中信号与槽使用(基础篇—9)

    有时候在项目开发时,经常会遇到一些耗时操作导致界面迟缓卡顿,为了解决这个问题,可以创建多线程,使用主线程更新界面使用线程实时处理数据,最后将结果显示到界面上。...在使用线程时可以直接得到Thread实例,调用其start()函数即可启动线程,线程启动之后,会自动调用其实现run()函数,该方法就是线程执行函数业务线程任务就写在run()函数中,当run()...QThread有startedfinished信号,可以为这两个信号指定槽函数,在线程启动结束之时执行一段代码进行资源初始化释放操作,更灵活使用方法是:在自定义QThread实例中自定义信号...在开始执行run函数之前,从相关线程发射此信号 finished 当程序完成业务逻辑时,从相关线程发射此信号 QThread简单使用如以下代码所示: class Thread(QThread):...: ---- 参考资料、拓展学习: 多线程(QtimerQthread),网页交互(QWebEngineView,js与python交互) PyQt5高级界面控件之QThread(十二)

    2K30

    python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

    ()函数中,当run()退出之后线程就基本结束了,QThread有startedfinished信号,可以为这两个信号指定槽函数,在线程启动结束之时执行一段代码进行资源初始化释放操作,更灵活使用方法是...长时间停留在此界面,知道多线程任务完成后,此界面才会动,当耗时程序非常大时,就会造成程序运行失败假象,实际还是在后台运行,只是没有显示在主窗口界面上,当然用户体验也就非常差,那么如何解决这个问题呢...QThread线程事件处理实例 对于执行很耗时程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,如果需要执行这个耗时程序时不断刷新界面。...那么就可以使用QApplication.processEvents(),那么就可以一边执行耗时程序,一边刷新界面的功能,给人感觉就是程序运行很流畅,因此QApplicationEvents()使用方法就是...本文详细介绍了python GUI库PyQt5线程类QThread详细使用方法,想了解更多相关知道请查看下面的相关链接

    8.3K36

    QThread

    与队列槽或调用方法不同,直接在QThread对象上调用方法将在调用该方法线程中执行。当子类化QThread时,请记住构造函数在旧线程中执行run()在新线程中执行。...此函数可用于长时间运行任务中判断中断状态。 从不检查或操作此函数返回值是安全,但建议在长时间运行函数中定期执行此操作。 注意:不要经常调用它,以保持低开销。...---- void QThread::requestInterruption()   请求中断线程。 该请求是建议性,由线程上运行代码决定它是否以及如何根据此类请求执行操作。...如果线程没有运行,则此函数执行任何操作并立即返回。使用start()启动具有特定优先级线程。   ...如果线程已在运行,则此函数执行任何操作。   优先级参数影响取决于操作系统调度策略。

    1.3K20

    QThread

    与队列槽或调用方法不同,直接在QThread对象上调用方法将在调用该方法线程中执行。当子类化QThread时,请记住构造函数在旧线程中执行run()在新线程中执行。...此函数可用于长时间运行任务中判断中断状态。 从不检查或操作此函数返回值是安全,但建议在长时间运行函数中定期执行此操作。 注意:不要经常调用它,以保持低开销。...---- void QThread::requestInterruption()   请求中断线程。 该请求是建议性,由线程上运行代码决定它是否以及如何根据此类请求执行操作。...如果线程没有运行,则此函数执行任何操作并立即返回。使用start()启动具有特定优先级线程。   ...如果线程已在运行,则此函数执行任何操作。   优先级参数影响取决于操作系统调度策略。

    2.6K20

    QThread 使用「建议收藏」

    使用场景 对于子类化 Thread 方式 对于 worker move to thread 方式 1. 引言 你会用QThread吗?有几种使用方式?这几种使用方式都在何种场景下使用?...也就是咱们这儿主线程 QThread 管理线程,就是 run 启动线程。也就是次线程 因为 QThread 对象依附在主线程中,所以他 slot 函数会在主线程中执行不是次线程。...是不是跟我们心里预期不一样?我想让一些耗时操作放到 onTimeOut 里面去处理,并且由线程来处理啊,怎么执行在主线程里?...对于子类化 Thread 方式 这种方式适用于一些任务场景: 很多经典线程问题(生产者,消费者等) 独立不依赖一些工作任务 这种方式有一些特点: 不需要事件循环,一次性执行 不需要被调用槽函数 可以自己定义...run() 函数实现 这种方式有一些陷阱: 提供槽函数,子类化对象是属于主线程,又没有事件循环,所以槽函数会被主线程执行 调用 moveToThread(this) 对于 worker move

    1.1K20

    PyQt5 界面显示无响应实现

    界面假死分析 在编写QT界面程序时,当我们调用QApplication.exec()时,我们就启动了QT事件循环。在开始时候,QT会发出一些事件显示绘制窗口部件。...在保存过程中,这个应用程序就不能响应窗口系统请求重绘自己。 解决方法 方式一使用多线程:一个处理应用程序用户界面的线程,另外一个执行文件保存线程。...这种方式危险性在于,也许用户在观测流程未保存好之前就关闭了主窗口,或者在界面上通过鼠标或键盘执行了其它输入,以至于观测流程未保存好就企图被程序使用。...正常情况下会将一些耗时函数扔进Qthread线程中避免页面假死情况。 但并不是所有的都是行, ?...,需要注意是,如果是耗时任务则会造成界面的卡死,并不大友好。

    3.7K10

    Qt多线程创建

    传统图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户用户界面中调用一个比较耗时操作,当该操作正在执行时,用户界面通常会冻结不再响应。...这个问题可以用事件处理多线程解决。 【使用多线程有什么好处?】 提高应用程序响应速度。...这对于开发图形界面程序尤其重要,当一个操作耗时很长时(比如大批量I/O或大量矩阵变换等CPU密集操作),整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长操作置于一个新线程...【Qt中创建线程方法】 只需要子类化QThread并重新实现它run()函数就可以了。run()是个纯虚函数,是线程执行入口,在run()里出现代码将会在另外线程中被执行。...new了多个按钮或控件,需要用setGeometry确定它们大小位置,否则前面的被后面的覆盖,最终看到是最后一个按钮。

    1.3K51

    PyQt5 解决界面无响应方案

    前言在PyQt5中,GUI线程通常指的是Qt主事件循环线程,也称为主线程。主线程负责处理GUI事件、更新UI界面任务。在PyQt5中,主线程GUI线程是同一个线程,即运行应用程序线程。...在事件循环中,主线程会不断地监听并处理用户输入事件、定时器事件、网络事件等,然后更新UI界面。...如果在主线程执行耗时操作,比如 循环、sleep、wait 异步线程执行 会导致 UI 界面进入无响应状态,我们可以采用以下两种方式异步处理:使用QThread 或 QTimer。...,我们会发现 UI 界面出现无响应且进度条没有刷新:解决方案为了避免 UI 界面无响应,我们可以采用以下两种方式:使用 QThread 或 QTimer。...当当前作用域代码执行完成后局部变量会被销毁。如果异步线程任务还没有完成,主线程事件循环又需要等待任务完成才能继续执行,那么就会导致GUI线程无响应。

    29620

    结合 Qt 信号槽机制 Python 自定义线程类

    图形界面程序中,往往是点击某个按钮后要处理特定功能逻辑,有些处理很快,所以感觉不到什么,但有些需要长时间处理,甚至可能进入死循环处理,这就会导致界面卡顿,一直等待事件处理完毕,这将会造成非常不友好用户体验...因此使用多线程处理的话,就可以把一些需要长时间处理程序丢给线程去处理,界面程序不受影响。...但如果想要实现由主线程打印当前时间,并且主线程中 while 内代码不变,照样每隔三秒打印 hello,那么这就遇到问题了:线程该如何向主线程传递数据并且不中断线程继续运行呢?...主线程又如何接受并处理线程发过来数据并且也不影响主线程正常运行呢?...可能玩过单片机的人应该想到了,对,可以使用类似 “中断” 方法实现,线程中每隔一秒向主线程发送中断请求,主线程则去处理中断,处理完后继续主线程动作。那么在上层应用中,如何实现这一过程呢?

    4.6K31

    Python Qt GUI设计:QTimer计时器类、QThread多线程类事件处理类(基础篇—8)

    这是在图形用户界面中实现复杂工作一个典型方法,随着技术进步,多线程在越来越多平台上被使用,最终QTimer对象会被线程所替代。...QThread有startedfinished信号,可以为这两个信号指定槽函数,在线程启动结束时执行一段代码进行资源初始化释放操作。...QThread类中常用方法如下表所示: QThread类中常用信号如下表所示: 通过一个示例,了解QThread多线程类使用方法,效果如下所示: 示例中,在主界面中有一个用于显示时间LCD...如果窗口长时间没有响应,则会影响用户体验,更严重会导致程序崩溃。所以,为了避免出现这样问题,要使用QThread开启一个新线程,在这个线程中完成耗时操作。...如果在执行这个耗时程序时不断地运行 QApplication.processEvents(),那么就可以实现一边执行耗时程序,一边刷新页面的功能,给人感觉就是程序运行很流畅。

    2.9K20

    Qt使用多线程一些心得——1.继承QThread多线程使用方法

    在UI线程下调用QThread非run函数(其实也不应该直接调用run函数,而应该使用start函数),执行普通函数无区别,这时,如果这个函数要对QThread某个变量进行变更,而这个变量在run...函数都不会中途终端线程,要马上终止一个线程可以使用terminate函数,但这个函数存在非常不安定因素,推荐使用。...这种情况非常多见,例如一个普通图片浏览器,都会有下一张图上一张图这种按钮,浏览器加载图片一般都在线程里执行(否则点击超大图片时图片浏览器会类似卡死状态),用户点击下一张图片时需要终止正在加载的当前图片...都知道 在线程运行过程调用quit函数有什么效果 答案是:不会发生任何效果,QThread不会因为你调用quit函数退出正在运行到一半run,正确退出线程方法上面有介绍。...善用QObject::deleteLater QObject::destroyed进行内存管理 由于多线程环境你不可预料下一步是哪个语句执行,因此,加锁自动删除是很有用工具,加锁是通过效率换取安全

    3.1K11

    详解PyQt5信号与槽几种高级玩法

    在Qt中,每一个QObject对象PyQt中所有继承自QWidget控件(这些都是QObject对象)都支持信号与槽机制。当信号发射时,连接槽函数将会自动执行。...这属于风格问题,笔者比较喜欢使用lambda表达式,因为其条理清晰,而且灵活。 3 装饰器信号与槽 所谓装饰器信号与槽,就是通过装饰器方法定义信号槽函数。...具体使用方法如下: @PyQt5.QtCore.pyqtSlot(参数) def on_发送者对象名称_发射信号名称(self, 参数): pass 这种方法有效前提是下面的函数已经执行:...最简单多线程使用方法是利用QThread函数,如下代码(见PyQt5/Chapter07/ qt07_signalSlot04.py)展示了QThread函数信号与槽简单结合方法。...,这样就会导致界面卡顿,这也是多线程应用范围之一——为了解决这个问题,我们可以创建多线程,使用主线程更新界面使用线程实时处理数据,最后将结果显示到界面上。

    3.4K30
    领券