zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt-信号和槽函数传递自定义参数前需注册自定义数据类型

Qt注册 函数 参数 自定义 数据类型 信号 传递
2023-09-11 14:16:44 时间

Qt 信号和槽函数参数只能是基于 Qt 的基础类型的,比如 QString、int、bool 等,如果想传递自定义类型默认情况下是行不通的。要想在 Qt 的信号和槽函数之间传递自定义类型,可以先将自己的自定义类型注册一下,使用如下代码:

Q_DECLARE_METATYPE(nim::DocTransInfo)

nim::DocTransInfo 为你的自定义数据结构,我这里是一个结构体。当需要传递这个数据时,不是直接使用,而是用 QVariant 来包装一下,信号和槽函数则直接使用 QVariant 类型的数据作为参数传递。首先我们连接信号和槽:

connect(this, SIGNAL(AddDocItemSignalNew(QVariant)), this, SLOT(AddDocItemNew(QVariant)), Qt::QueuedConnection);

信号和槽函数的声明如下:

signals:
    void AddDocItemSignalNew(QVariant variant);
private slots:
    void AddDocItemNew(QVariant variant);

当要发起信号的时候,把我们要传递的这个数据包装到 QVariant 中,然后传递给信号函数就可以了。如下所示:

QVariant data;
data.setValue(file_info);
emit AddDocItemSignalNew(data);

槽函数接受到信号时可以像如下方法一样解析参数出来使用:

void MainForm::AddDocItemNew(QVariant variant)
{
    nim::DocTransInfo doc_info = variant.value<nim::DocTransInfo>();
    // ....... 其他代码
}

这样包装后,我们就可以使用 Qt 的信号和槽功能来传递自定义数据结构了。

/********************

Qt两种传参形式(信号槽传参、界面传参)

一、UI界面传参
在Qt中传输数据通常有两种形式,一种是把待传输的数据先保存到UI界面的控件中,然后子类从界面中读取数据。

使用该控件作为参数传递承载。
1.首先将计算出的数值传到控件中
   ui->BCResult_0->setValue(Robticspose[0]);
    ui->BCResult_1->setValue(Robticspose[1]);
    ui->BCResult_2->setValue(Robticspose[2]);
    ui->BCResult_3->setValue(-euler2);
    ui->BCResult_4->setValue(-euler1);
    ui->BCResult_5->setValue(-euler0);

2.从空间中读取数值

  s_data[0]=ui->BCResult_0->value();
    s_data[1]=ui->BCResult_1->value();
    s_data[2]=ui->BCResult_2->value();
    s_data[3]=ui->BCResult_3->value();
    s_data[4]=ui->BCResult_4->value();
    s_data[5]=ui->BCResult_5->value();
    s_data[6]=ui->spinBox_result_FaceType->value();//面的种类

二、信号槽传参
本文提出的信号槽传参形式有一定缺点,望读者在使用或阅读后,指出技术缺陷,大家共同探讨一起进步。
通常信号槽传参和UI界面传参只用一个。
使用信号槽传参时,在创建相关子类时要继承QObject类
信号语法形式如下
signals:
     void dataready(double x, double y , double z, double Rx, double Ry, double Rz);

     emit dataready(Robticspose[0],Robticspose[1],Robticspose[2],-euler2,-euler1,-euler0);

-使用该信号

 connect(eular_change,SIGNAL(dataready(double,double,double,double,double,double)),this,SLOT(readdata1(double, double , double, double, double, double)));
接受数据
可以看到上文的connect函数的参数,当子类的信号传到mainwindow中,主类需要写一个参数接受函数,完成参数传导。
void MainWindow::readdata1(double x, double y , double z, double Rx, double Ry, double Rz)
{
    qDebug()<<"x:+"<<x;
    ABBrobot->writeData(x,y,z,Rx,Ry,Rz,1);
}