欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > QT c++ QMetaObject::invokeMethod函数 线程给界面发送数据

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

2025/2/21 3:12:24 来源:https://blog.csdn.net/weixin_39926429/article/details/145628487  浏览:    关键词: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)
            );

   //-------------------------------------------

       // 发送数组
        QVariantList shortList;
        unsigned short data[5] = {1, 2, 3, 4, 5};
        for (int i = 0; i < 5; ++i)
        {
            if(seq%2) 
            shortList.append((data[i]));
            else
            shortList.append((data[i])+5);
        }

        QMetaObject::invokeMethod
            (this->parent(),
             "DataChanged2",
             Qt::QueuedConnection,
             Q_ARG(QVariantList, shortList)
             );

        //qDebug()<<this->parent();
    }
 }

2.界面

(1)头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "thread1.h"
#include <QString>
#include <QDebug>
#include <QVariant>
#include <QVariantList>
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);//本行和前面的行的效果一样

        void DataChanged2(const QVariantList &list);
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));
}

void Widget:: DataChanged2(const QVariantList &list)
{
     QStringList list_str;
    for (int i = 0; i < list.size(); ++i)
    {
        list_str.append(list[i].toString());
    }
    QString str0=list_str.join(",");
    ui->plainTextEdit->setPlainText(str0);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词