zoukankan      html  css  js  c++  java
  • 41.QT-多线程与界面之间交互总结

    1. 线程与界面组件需要注意的地方

    • 在QThread线程中不能直接创建QWidget之类的界面组件.
    • 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread)
    • 所以, QThread线程不能直接操作界面组件.

    2.QThread线程如何操作界面组件-方法1

    • 将多线程类对象封装为GUI界面类的类成员
    • 然后在子线程定义信号函数,通过信号槽机制,向界面组件emit发射信号,从而实现间接操作.

    3.QThread线程如何操作界面组件-方法2

    • 使用QApplication::postEvent()实现向界面发送事件,从而能够封装一个自定义类

     

    4.使用Invokes()函数来调用界面组件的信号槽-方法3

    一般使用该函数(用来调用对方的私有信号或槽):

    该函数的连接方式默认使用的是Qt::AutoConnection

    • 表示如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

     

    比如,当我们想调用一个obj下的compute(QString, int, double)槽函数时:

    则只需要写入:

    QMetaObject::invokeMethod(obj, "compute",
                                Q_ARG(QString, "sqrt"),                        
                                Q_ARG(int, 42),
                                Q_ARG(double, 9.7));

    示例如下所示:

    在Testtherd线程类里通过invokeMethod向父界面类的paintMsg槽函数发送信息

    void Testtherd::run()
    {
    int count=0; while(1) { QString str="请稍等,正在验证用户,登录中"; for(int i =0;i<count;i++) str.append('.'); //循环添加小数点 count=(count+1)%7; QMetaObject::invokeMethod(this->parent(), "paintMsg", Q_ARG(QString, str)); msleep(500); } }

    父界面类的paintMsg槽函数如下所示:

    void loginwindow:: paintMsg(QString msg) {
    this->LineHint->setText(msg);
    }

    运行效果如下:

     

  • 相关阅读:
    Spring Jdbc事例说明(三)
    Spring 在+publicId+和+systemId+之间需要有空格
    Spring 开发环境搭建(二)
    Spring 基础概念——DI、IOC(一)
    SHELL字符串使用总结
    POSTGRESQL 创建表结构、修改字段、导入导出数据库(支持CSV)
    Spring+mybatis+postgresql整合
    Mybatis 自动生成代码,数据库postgresql
    POSTGRESQL 自动登录
    POSTGRESQL表分区
  • 原文地址:https://www.cnblogs.com/lifexy/p/10907901.html
Copyright © 2011-2022 走看看