본문 바로가기

Programming

터치가 예민한 보드에서 사용할 클릭 가능한 ImageLabel

반응형
이미지가 많이 들어가고 각각 클릭 가능해야 하는 프로젝트를 진행하고 있습니다.
QButton으로 모두 넣으니 리소스 문제로 보드에서 실행이 되지 않았습니다.

그래서 생각한게 QLabel로 대신하는 방법입니다.
문제는 QLabel 에는 clicked 라는 signal이 없어서 어떻게 클릭 여부를 체크해야하는 가? 입니다.

QLabel이 상속받은 상위 클래스를 따라 올라가다 보면 QWidget 이라는 클래스가 있습니다.

mouseMoveEvent(QMouseEvent*);
mousePressEvent(QMouseEvent*);
mouseReleaseEvent(QMouseEvent*);

아래 두개가 마우스 클릭과 관련된 이벤트 입니다.

사용하려면 QWidget을 상속받는 하위 클래스를 만들어야 합니다.
QLabel이 QWidget을 상속 받으니 ImageLabel이라는 클래스를 만들어서 QLabel을 상속 받으면 됩니다.

imagelabel.h
#include <qlabel.h> class ImageLabel: public QLabel{ Q_OBJECT public: ImageLabel::ImageLabel(QWidget *parent, const char *name); signals: void clicked(ImageLabel *); protected: void mouseMoveEvent(QMouseEvent * e); void mouseReleaseEvent(QMouseEvent * e); };

 imagelabe.cpp
#include "imagelabel.h" ImageLabel::ImageLabel ( QWidget *parent, const char *name) : QLabel(parent,name,0){ } void ImageLabel::mouseReleaseEvent(QMouseEvent * e){ QLabel::mouseReleaseEvent(e); emit clicked(this); }

이제 이미지를 하나씩 클릭할때 발생하는 이벤트를 만들었습니다.
signal 을 만들어 slots을 연결하여 사용하기 쉽게 했습니다.

아직 문제가 존재 합니다.....
실습 보드인 PXA255-PRO 는 터치가 너무 예민해서 한번 클릭으로 10번 정도의 클릭 이벤트가 발생합니다.
기존 프로젝트에서는 sleep()을 사용하여 클릭이 중복되는 것을 방지하였습니다.
이번에는 간단한 코드를 이용하여 구현하기 위해 작업하였습니다.

현재 눌려진 객체를 담는 ImageLabel 포인터 변수(clickedObject)를 만들고 mouseMoveEvent()에서 this가 아니면 코드를 실행하고 자신을 넣어 줍니다. 서로 다른 ImageLabel 끼리는 클릭이 가능하나 같은 ImageLabel 에서는 연속 두번 이상 클릭이 안됩니다. 

static ImageLabel *clickedObject;

라고 클래스 멤버변수로 지정하였으나 계속 레퍼런스 오류가 발생합니다. 정확한 이유를 몰라서 클래스 밖으로 빼버렸습니다.

imagelabel.h
#include <qlabel.h> class ImageLabel: public QLabel{ Q_OBJECT public: ImageLabel::ImageLabel(QWidget *parent, const char *name); signals: void clicked(ImageLabel *); protected: void mouseReleaseEvent(QMouseEvent * e); }; static ImageLabel *clickedObject = NULL;

 imagelabel.cpp
#include "imagelabel.h" ImageLabel::ImageLabel ( QWidget *parent, const char *name) : QLabel(parent,name,0){ } void ImageLabel::mouseReleaseEvent(QMouseEvent * e){ if(clickedObject != this){ QLabel::mouseReleaseEvent(e); emit clicked(this); clickedObject = this; } }

생각보다 간단히 해결이 되었습니다. 코드는 간단하지만 여기까지 오는 시간은 절대 짧지만은 않았습니다. ㅜ.ㅜ

ImageLabel로 제가 원하는 만큼의 이미지를 출력하고 클릭 이벤트까지 무리없이 동작할 수 있을지 궁금하네요.
반응형