文章目录
- 前言
- 一、QT环境配置
- 二、信号、槽、事件
- 三、头文件冲突
- 总结
前言
做的一个点云检测项目,因为有模板匹配和ICP的内容,所以需要制作模板,领导觉得得有个界面,所以写个界面锻炼一下。
一、QT环境配置
就按别人的博客安装就好了,为了可以编译还得装个WinBag。
需要注意的是我按网上的安装winbag以后并不是直接就好了。会多出一个文件夹,在里面找到x64的安装文件再装一下就好了。
我是习惯在Visual Studio 里面编程,所以安装完qt以后还得安装一个插件。
高大上的清华镜像库
二、信号、槽、事件
其实主要区分的还是事件和信号,信号类似于从某个控件广播出来的一个讯息,而事件是控件内部在发生一个事件以后执行的内容。
比如QLabel控件,原生的信号是没有鼠标点击的Clicked信号的,但是有从QWight继承来的鼠标点击事件。在我的应用中,我需要在鼠标点击QLabel后,能从控件外部的函数中获取到点击位置的坐标。事件是在内部的,不满足要求,而又没有符合我要求的信号。
所以需要的操作就是写个类继承QLabel,添加一个信号,并且重写鼠标点击事件,在事件内部触发并发送这个信号。
这样外部就可以通过把槽函数和这个信号连接,实现我所想要的功能。网上的信息互相抄来抄去,还不全,最后也是综合摸索才摸索出来的。
下面是代码示例和讲解:
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
#include<QEvent>
#include <QMouseEvent>
#include<iostream>
class MyLabel :public QLabel
{
Q_OBJECT;
public:
MyLabel(QWidget *parent = 0);
~MyLabel();
signals:
void MyClicked(int,int, int);
public:
void mousePressEvent(QMouseEvent *e);//鼠标点击事件
};
#endif // MYLABEL_H
头文件中增加MyClicked信号,包含三个int参数。
#include "mylabel.h"
MyLabel::MyLabel(QWidget* parent) :QLabel(parent)
{
}
MyLabel::~MyLabel()
{
}
void MyLabel::mousePressEvent(QMouseEvent *e)
{
int x_in_Label = e->x();
int y_in_Label = e->y();
if (e->button() &Qt::LeftButton)
{
emit MyClicked(0,x_in_Label, y_in_Label);
}
else
{
emit MyClicked(1, x_in_Label, y_in_Label);
}
std::cout << "mouse_in_label: " << x_in_Label << "," << y_in_Label;
}
在cpp中重写了mousePressEvent,内部主要就是触发信号,我这边是为了偷懒,就在点击事件里直接往外传左击还是右击,以及坐标,比较勤快的同学可以高端一点,自己想。
外部还是按QT传统做法绑定槽函数就好了。我这边就不做QT教学了。
但反正QT简单应用就是这些方式,有信号,就信号槽绑定用一下,没有信号槽有事件就自己加个信号。要是事件也没有,那可能也有办法加,但是我不知道了,毕竟我是高贵的算法工程师(其实我就是夸张一下,软件工程师不要打我)。
三、头文件冲突
使用过程中出现添加#include<pcl/io/pcd_io.h>头文件后,报错
“ACCESS_MASK”: 不明确的符号
网上查找的都是opencv导致的错误,但我不是opencv呀,不过有个杀手锏,那就是在封装一个头文件和cpp。把可能会引起冲突的头文件放到cpp里,然后在cpp里实现你本来要有的功能。
比如我本来要在外部引用这个头文件来保存pcd文件,但是会冲突,那我建一个pclutils.h和pclutils.cpp,把不会冲突的必须头文件放在.h,会冲突的放在cpp,在cpp封装一个函数,来完成存储。
外部引用.h就可以调用这个功能了,完成,杀手锏~