文章目录

  • 前言
  • 一、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就可以调用这个功能了,完成,杀手锏~