반응형
.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);
}
감사합니다.
잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다.
반응형
'GUI > C++ Qt' 카테고리의 다른 글
[C++/QT] 무설치 배포 프로그램 만들기(Portable) (8step) (0) | 2022.07.03 |
---|---|
[C++/QT] QRadioButton 체크 그룹 해제하기 (0) | 2022.07.03 |
[C++/QT] 전체 ui 이벤트 처리 함수 (eventFilter) - 클래스형 (0) | 2022.06.23 |
[C++/QT] 프로그램 중복방지 (QSharedMemory) (0) | 2022.06.20 |
[C++/QT] 프로젝트 만들기 (4step) (0) | 2022.06.19 |