当前位置: 首页 > news >正文

QT c++ QMetaObject::invokeMethod函数 线程给界面发送数据

在项目开发时,常常需要用线程采集数据,如果要给界面发送数据,本文是方法之二,动态调用

第一步:在界面类里定义一个带Q_INVOKABLE关键字的函数接收信息

第二步:在线程类里,用 QMetaObject::invokeMethod函数把数据发送出去,注意此函数中中指明的第二个参数是在第一步中的函数名称,第四个参数中指明了函数参数类型和个数,要和第一步保的函数参数类型和个数保持一致。

bool QMetaObject::invokeMethod

(QObject *obj,//第一个参数

const char *member,//第2个参数

Qt::ConnectionType type = Qt::AutoConnection,//第3个参数

QGenericReturnArgument ret = QGenericReturnArgument(),//可以有返回值,也可以没有返回值

QGenericArgument val0 = QGenericArgument(nullptr),//member字符变量对应函数的第1个参数

QGenericArgument val1 = QGenericArgument(), ...,//...

QGenericArgument val9 = QGenericArgument()///member字符变量对应函数最多10个参数

)

例子

1.线程

(1)头文件

#ifndef THREAD1_H
#define THREAD1_H

#include <QThread>
#include <QDebug>
class Thread1 : public QThread
{
    Q_OBJECT
public:
    explicit Thread1(QObject *parent = nullptr);

protected:
    void run()  override; //线程的循环
private:
    int seq=0;

};

#endif // THREAD1_H
 

(2)cpp文件

#include "thread1.h"

Thread1::Thread1(QObject *parent)
    : QThread{parent}
{
}
void Thread1:: run()
{   qDebug()<<"void Thread1:: run()";
    while(1)
    {
        QThread::msleep(100);
        seq++;
        //emit send_info(seq);
         QMetaObject::invokeMethod
            (this->parent(),
             "DataChanged",
            Qt::QueuedConnection,
            Q_ARG(int, seq)
            );
        //qDebug()<<this->parent();
    }
 }

2.界面

(1)头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "thread1.h"
#include <QString>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    Q_INVOKABLE void DataChanged(int a);

//public slots://本行及下一行和上行的效果一样
      //  void DataChanged(int a);
private:
    Ui::Widget *ui;
    Thread1 * thread1;
   
};
#endif // WIDGET_H

(2)cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    thread1=new Thread1(this);
    thread1->start();
}

Widget::~Widget()
{
    delete ui;
}
void Widget:: DataChanged(int a)
{
    //qDebug() << "DataChanged:"<<a;
    ui->plainTextEdit->setPlainText(QString::number(a));
}

http://www.dtcms.com/a/16953.html

相关文章:

  • UE5中的快捷键汇总
  • 电源测试和测量系统的创新遥感方法可以消除哪些潜在问题
  • 土建施工员考试题库及答案
  • 在 CentOS 上更改 SSH 默认端口以提升服务器安全性
  • Django 初学小案例:用户登录
  • Windows搭建SVN本地服务器 + TortoiseSVN客户端
  • SQL Query美化
  • 单细胞学习(13)—— Seurat → Scanpy 分析流程
  • UnrealEngine开发无人机飞行模拟软件的手柄如何选择
  • JAVA生产环境(IDEA)排查死锁
  • Grafana Windows在 Windows 上轻松实现数据监控与可视化
  • VSCODE - 连接远程linux服务器,报错XHR failed 解决方法
  • C语言-------结构体(1)
  • 华宇TAS应用中间件与因朵科技多款产品完成兼容互认证
  • 内容中台驱动企业数字化内容管理高效协同架构
  • Spring框架中都用到了哪些设计模式?
  • 电商小程序(源码+文档+部署+讲解)
  • 【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析
  • MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
  • 卷积神经网络实战人脸检测与识别
  • java面试题-集合篇
  • 游戏引擎学习第98天
  • 【环境安装】重装Docker-26.0.2版本
  • 欧拉公式在信号处理中的魔法:调幅信号的生成与频谱分析
  • 利用AI智能体创建云端文档知识库并集成第三方数据源(上)
  • 【项目日记(五)】第二层: 中心缓存的具体实现
  • 黑马SpringCloud微服务课程总结(一)
  • 第一章嵌入式系统概论考点04SoC芯片
  • 【现代深度学习技术】深度学习计算 | GPU
  • 【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】