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