Qt信号和槽的个人总结(★firecat推荐★)

1、connect

[cpp] view plaincopy

  1. connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));  

这里用到了两个宏:SIGNAL() 和SLOT();通过connect声明可以知道这两个宏最后倒是得到一个const char*类型。
在qobjectdefs.h中可以看到SIGNAL() 和SLOT()的宏定义:

[cpp] view plaincopy

  1. #ifndef QT_NO_DEBUG  
  2. # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)  
  3. # define METHOD(a)   qFlagLocation("0"#a QLOCATION)  
  4. # define SLOT(a)     qFlagLocation("1"#a QLOCATION)  
  5. # define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)  
  6. #else  
  7. # define METHOD(a)   "0"#a  
  8. # define SLOT(a)     "1"#a  
  9. # define SIGNAL(a)   "2"#a  
  10. #endif  

所以这两个宏的作用就是把函数名转换为字符串并且在前面加上标识符。

比如:SIGNAL(read())展开后就是"2read()";同理SLOT(read())展开后就是"1read()"。

[cpp] view plaincopy

  1. connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));  
  2. 实际上就是connect(sender,“2signal()”,receiver,“1slot())”;  

 

2、slots,signals

Qt4源码定义的宏如下:

# define slots

#define signals protected

# define emit

再来看例子:

#ifndef COUNTER_H

#define COUNTER_H
 
#include <QObject>
 
class Counter : public QObject
{
    Q_OBJECT
 
public:
    Counter();
 
private:
    int m_value1;
    int m_value2;
 
public slots:
    void setValue1(int value);
    void setValue2(int value);
 
signals:
    void valueChanged1(int newValue);
    void valueChanged2(int newValue);
};
 
#endif // COUNTER_H
 
注意,头文件定义的public slots和signals对C++编译器而言没有意义,会被替换成public和protected。他们的真实意图其实是给moc工具使用的,moc根据这些字符串关键字匹配,用来生成文件moc_Counter.cpp。Qt源码的构建过程是先moc转换然后再执行C++编译器。moc的目的是展开信号和槽,生成一个能让编译器读懂的源文件。
以下是生成的moc文件:
 

QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_Counter[] = {

 // content:        6,       // revision //指明moc生成代码的版本号:Qt4的moc生成的代码,该值是6,也就是相当于moc v6;Qt5则是7        0,       // classname //类名的索引,在数组qt_meta_stringdata_Counter的起始下标是0        0,    0, // classinfo        4,   14, // methods //有4个函数(2个信号函数,2个槽函数);函数的描述在数组qt_meta_data_Counter的起始下标是14        0,    0, // properties        0,    0, // enums/sets        0,    0, // constructors        0,       // flags        2,       // signalCount //信号函数的数量

 // signals: signature, parameters, type, tag, flags       18,    9,    8,    8, 0x05, //信号的索引,在数组qt_meta_stringdata_Counter的起始下标是18,flags:0x05表示是信号       37,    9,    8,    8, 0x05, //同上

 // slots: signature, parameters, type, tag, flags       62,   56,    8,    8, 0x0a, //槽的索引,在数组qt_meta_stringdata_Counter的起始下标是62,flags:0x0a表示是槽

      77,   56,    8,    8, 0x0a, //同上

       0        // eod };

static const char qt_meta_stringdata_Counter[] = {     "Counter\0\0newValue\0valueChanged1(int)\0"     "valueChanged2(int)\0value\0setValue1(int)\0"     "setValue2(int)\0" };

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Halcon中获取xld是通过读取dxf文件并进行一系列操作来实现的。首先需要使用read_contour_xld_dxf函数读取dxf文件的机械坐标数值,并存储在DxfContours中。然后使用union_adjacent_contours_xld函数来合并邻近的XLD,使得细小线段拼接起来,结果存储在UnionContours中。接下来可以使用count_obj函数获取UnionContours中的轮廓数量,并使用select_obj函数选择其中一个轮廓。然后可以使用get_contour_xld函数获取该轮廓的坐标值。另外,还可以使用length_xld函数获取轮廓的长度。最后,可以使用create_local_deformable_model_xld函数创建可变形模型,并使用get_deformable_model_contours函数获取模型的轮廓。如果需要进行镜像操作,可以使用hom_mat2d_reflect函数进行上下翻转,并使用affine_trans_contour_xld函数对UnionContours进行仿射变换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Halcon读取dxf文件生成xld,然后实现点坐标遍历/缩放/镜像/求最大面积等操作(firecat推荐)](https://blog.csdn.net/libaineu2004/article/details/102821750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值