Qt-信号和槽函数传递自定义参数前需注册自定义数据类型
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);
}
相关文章
- Qt没有被正确安装,请运行make install -- 问题的解决办法
- qt中的进程优先级及应用内存大小设置方法,VS和Qt工程中申请超过2G的内存的方法
- QT-多线程重要概念及与界面之间交互总结(混淆点分析:c#中可以在子线程中创建ui控件,qt中不能在子线程中创建ui控件)
- Qt事件处理的几种方式
- Qt窗体布局思路
- 【QT】Qt获取前几天/后几天的时间
- QT工具——qt for vs
- Qt编写物联网管理平台47-通用数据库设置
- Qt编写安防视频监控系统49-多数据库支持
- Qt creator 最常用的13个快捷键
- Qt使用第三方库
- Qt之自定义控件(开关按钮)
- 报错 qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found
- VS2010使用静态编译的qt库(Qt 5)
- 【正点原子Linux连载】第二章 C++基础摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2
- Qt助手(assistant):方便查找Qt类
- Qt编译mysql以及创建表后进行导入操作