• 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);
    }

    运行效果如下:

     

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14273291.html
Copyright © 2020-2023  润新知