반응형

 

.ui 에서 특정 ui만 이벤트 처리하기 위해 installEventFilter와 eventFilter 함수를 사용한다.


# 개발도구

  • 개발도구 : Visual Studio Community 2017
  • QT 버전 : 5.12.5

 

# 결과

  • 마우스 클릭 이벤트 처리
    - 버튼 누를 시 "mouseClick : pushButton" 출력
    - 라벨 누를 시 "mouseClick : label" 출력
  • 키보드 입력 이벤트 처리
    - 버튼 누를 시 "keyPress : pushButton" 출력

 

# 전체 소스

  • 이벤트 처리할 ui 설정 (installEventFilter)
  • 이벤트 처리 함수 (eventFilter)

- QtExample.cpp

QtExample::QtExample(QWidget *parent) : QMainWindow(parent)
{
	ui.setupUi(this);

	setWindowTitle("QtExample");

	ui.label->installEventFilter(this);
	ui.pushButton->installEventFilter(this);
}

QtExample::~QtExample()
{

}

bool QtExample::eventFilter(QObject *obj, QEvent *e)
{
	int key;
	QString objName = obj->objectName();
	QKeyEvent *keyEvent = static_cast<QKeyEvent*>(e);
	QEvent::Type eventType = keyEvent->type();

	if(eventType==QEvent::KeyPress)
	{
		if(objName=="pushButton"){
			printf("keyPress : pushButton\n");
		}else{
			printf("none\n");
		}
	}
	else if(eventType==QEvent::MouseButtonRelease)
	{
		if(objName=="pushButton"){
			printf("mouseClick : pushButton\n");
		}else if(objName=="label"){
			printf("mouseClick : label\n");
		}else{
			printf("none\n");
		}
	}

	return QObject::eventFilter(obj, e);
}

- QtExample.h

#pragma once

#include "ui_QtExample.h"
#include <iostream>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
#include <QKeyEvent>

class QtExample : public QMainWindow
{
    Q_OBJECT

public:
    QtExample(QWidget *parent = nullptr);
    ~QtExample();


private:
    Ui::QtExampleClass ui;
	bool eventFilter(QObject *obj, QEvent *e);

};

 

# 단위 분석

  • QtExample::QtExample(QWidget *parent) : QMainWindow(parent)
  • 이벤트 처리할 ui 설정 (installEventFilter)
    - ui.label->installEventFilter(this);
    - ui.pushButton->installEventFilter(this);
  • 사용자가 키보드 또는 마우스로 이용하여 label 또는 pushButton 조작 시 이벤트(핸들러)를 받을 수 있다.
QtExample::QtExample(QWidget *parent) : QMainWindow(parent)
{
	ui.setupUi(this);

	setWindowTitle("QtExample");

	ui.label->installEventFilter(this);
	ui.pushButton->installEventFilter(this);
}

  • bool QtExample::eventFilter(QObject *obj, QEvent *e)
  • QObject, QEvent 인자를 이용하여 object name 과 object class name을 구할 수 있다.
  • 키보드 또는 마우스 입력 판단은 QKeyEvent 로 통해 type 함수에서 판단할 수 있다.
    - 이벤트 타입 받기 : keyEvent->type();
    - 타입 종류 : QEvent::keyPress 또는 QEvent::MouseButtonRelease 등. (링크:keyEvent type 종류 보기)
bool QtExample::eventFilter(QObject *obj, QEvent *e)
{
	int key;
	QString objName = obj->objectName();
	QKeyEvent *keyEvent = static_cast<QKeyEvent*>(e);
	QEvent::Type eventType = keyEvent->type();

	if(eventType==QEvent::KeyPress)
	{
		if(objName=="pushButton"){
			printf("keyPress : pushButton\n");
		}else{
			printf("none\n");
		}
	}
	else if(eventType==QEvent::MouseButtonRelease)
	{
		if(objName=="pushButton"){
			printf("mouseClick : pushButton\n");
		}else if(objName=="label"){
			printf("mouseClick : label\n");
		}else{
			printf("none\n");
		}
	}

	return QObject::eventFilter(obj, e);
}

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


 

반응형

+ Recent posts