首页 > 其他分享 >41.QT-多线程与界面之间交互总结

41.QT-多线程与界面之间交互总结

时间:2023-06-05 22:32:24浏览次数:33  
标签:界面 QT paintMsg 41 线程 QString 组件 多线程 函数

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

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

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

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

 

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

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

 

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

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

41.QT-多线程与界面之间交互总结_封装

该函数的连接方式默认使用的是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槽函数发送信息

41.QT-多线程与界面之间交互总结_信号槽_02

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

运行效果如下:

 

41.QT-多线程与界面之间交互总结_信号槽_03



标签:界面,QT,paintMsg,41,线程,QString,组件,多线程,函数
From: https://blog.51cto.com/u_4018548/6420122

相关文章

  • Qt Sginals&Slots基本原理(1)
    moc(meteobjectcompiler)C++语言原生不支持反射(简单来说就是描述自身结构的信息,例如类名、函数有多少个参数之类的信息)moc准确来说是一个代码生成器,通过分析头文件(Qt的一些宏、信号、槽、属性等),生成对应的C++代码(包含类名字、信号函数、函数名字等信息)moc这种非原生C++的机......
  • Java中为什么禁止把SimpleDateFormat定位为static变量以及如果非要使用static定位Simp
    场景Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/art......
  • 多线程同步AutoResetEvent 和ManualResetEvent
         ......
  • Qt 中事件与处理
    一、事件与处理程序在运算过程中发生的一些事情:鼠标单击、键盘的按下...这些的事件的监控与处理在Qt中不是以信号的方式处理的。当这些事件发生时会调用QObject类中的功能函数(虚函数),所有的控件类都继承了这个类。常用的鼠标事件:voidmousePressEvent(QMouseEvent*);按下voidmous......
  • python爬虫爬取快手视频多线程下载功能【fd的使用】
    环境:python2.7+win10工具:fiddlerpostman安卓模拟器首先,打开fiddler,fiddler作为http/https抓包神器,这里就不多介绍。配置允许https 配置允许远程连接也就是打开http代理 电脑ip:192.168.1.110然后确保手机和电脑是在一个局域网下,可以通信。由于我这边没有安卓......
  • Qt里怎么恢复一个被最小化的窗口
    这个需求出现在窗口最小化之后又被再次运行的时候。很多用户往往不去注意窗口是否已经存在,而是经常直接再次执行打开窗口操作。为了拦截这种情况,通常我们会去检测到窗口是否已经存在,如果存在则把它恢复正常,而不是再新创建一个。这个操作是通过ShowNormal()实现的,但这个函数在wi......
  • C语言多线程爬虫代码示例
    使用C语言编写多线程爬虫能够同时处理多条数据,提高了爬虫的并发度和效率。在编写多线程爬虫时仍需要注意线程安全性和错误处理机制,并根据系统资源和目标网站的特点调整线程数和优化并发策略,以提高程序效率和稳定性。以下是一个使用C语言多线程编写的简单爬虫示例,实现了并发爬取多......
  • Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
    (目录)使用单线程单线程修改计数器的值,没有发生问题,每次运行结果都是10000,不过程序耗时较长packagecom.example;/***计数器*/classCounter{privatestaticlongcount;publicstaticlonggetCount(){returncount;}publicstaticv......
  • QT的特殊命名空间方式和C++对比
    Qt有以下的写法QT_BEGIN_NAMESPACEnamespaceUi{classWidget;}QT_END_NAMESPACE在开始和结束关键字中间进行命名空间的创建及其内部类的声明 而C++则是直接进行创建namespaceMyNamespace{//在MyNamespace命名空间内定义的类、函数、变量等classMyC......
  • QT的类的一些知识点
    给一个例子classSerialReaderThread:publicQThread{Q_OBJECTpublic:explicitSerialReaderThread(QSerialPort*serialPort,QObject*parent=nullptr):QThread(parent),serialPort(serialPort){}protected:voidrun()override......