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

}

相关推荐
让我们一起加油好吗13 小时前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
Yupureki13 小时前
从零开始的C++学习生活 14:map/set的使用和封装
c语言·数据结构·c++·学习·visual studio·1024程序员节
一匹电信狗13 小时前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl
keineahnung234513 小时前
C++中的Aggregate initialization
c++·1024程序员节
胖咕噜的稞达鸭13 小时前
算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
c语言·数据结构·c++·算法·推荐算法·1024程序员节
Yupureki13 小时前
从零开始的C++学习生活 15:哈希表的使用和封装unordered_map/set
c语言·数据结构·c++·学习·visual studio·1024程序员节
Q一件事13 小时前
R语言随机森林分析显示R方和P值
开发语言·随机森林·r语言
我是华为OD~HR~栗栗呀13 小时前
华为OD-Java面经-21届考研
java·c++·后端·python·华为od·华为·面试
Mr.Jessy13 小时前
JavaScript学习第六天:函数
开发语言·前端·javascript·学习·html·1024程序员节
努力学习的小廉14 小时前
我爱学算法之—— 分治-归并
c++·算法·1024程序员节