사용자의 UI 조작에 따라 기능동작할 수 있도록 이벤트 처리 코드를 구현한다.
수많은 UI와 클래스, 화면탭, 단축키, 마우스조작방법, 동시 키실행 등이 있는 경우 각 UI클래스마다 이벤트 처리를 해주어야 할 것들이 많다.
위와 같은 코드 복잡성 증가를 줄이기 위해 각 코드마다 유지보수를 쉽게 할 수 있고, 모든 이벤트들을 처리할 수 있는 함수로 구성된 클래스를 만들 것이다.
# 참고자료
- 깃허브 : https://github.com/WonMan-Kang/ex_Qt
- eventFilter 기본형 : [C˙C++/_QT] - #5_[Visual/C++/QT] 개별 ui 이벤트 처리 함수 (eventFilter) - 기본형
#5_[Visual/C++/QT] 개별 ui 이벤트 처리 함수 (eventFilter) - 기본형
.ui 에서 특정 ui만 이벤트 처리하기 위해 installEventFilter와 eventFilter 함수를 사용한다. # 개발도구 개발도구 : Visual Studio Community 2017 QT 버전 : 5.12.5 # 결과 마우스 클릭 이벤트 처리 - 버튼 누..
manbedded.tistory.com
# 개발환경
- 개발도구 : Visual Studio Community 2017
- QT 버전 : 5.12.5
# 결과

# 프로젝트 파일 구성
- QtExample 프로젝트명으로 생성함.
- 추가적으로 QEventFilter 생성함. (.h, .cpp)

# 전체 소스
1. QEventFilter 클래스 생성.


2. stdlib.h 소스 작성.
- 각 클래스마다 라이브러리를 작성하기 귀찮아서 하나의 헤더파일에서 라이브러리를 작성함.
- stdlib.h
#pragma once
#include <iostream>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
#include <QKeyEvent>
#include <qpushbutton.h>
#include <qsharedmemory.h>
#include <qobject.h>
#include "QEventFilter.h"
2. QEventFilter 소스 작성.
- QEventFilter.h
#pragma once
#include "stdlib.h"
class QEventFilter : public QObject
{
Q_OBJECT
public:
explicit QEventFilter(QObject *parent = nullptr);
~QEventFilter();
private:
bool eventFilter(QObject *obj, QEvent *e);
};
- 아래 소스는 pushButton을 Return (오른쪽 shift 위) 키로도 push할 수 있도록 함.
- Return 키를 누를 시 QObject 로 ui 클래스로 변환하여 클릭 시그널을 호출함.
- QEventFilter.cpp
#include "QEventFilter.h"
QEventFilter::QEventFilter(QObject *parent) : QObject(parent) { }
QEventFilter::~QEventFilter() { }
bool QEventFilter::eventFilter(QObject *obj, QEvent *e)
{
int key;
QString objName;
QString objClassName;
QPushButton *qButton;
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(e);
QEvent::Type eventType = keyEvent->type();
if(eventType==QEvent::KeyPress)
{
key = keyEvent->key();
objName = obj->objectName();
objClassName = QString(obj->metaObject()->className());
if(key==Qt::Key_Return){
if(objClassName=="QPushButton"){
qButton = qobject_cast<QPushButton*>(obj);
qButton->clicked();
}
}else if(keyEvent->matches(QKeySequence::Copy)==true){
printf("key press : copy\n");
}
}
return QObject::eventFilter(obj, e);
}
3. eventFilter 설정
- QApplication 에 EventFIlter 설정. (installEventFilter)
- 전체 ui에 대한 이벤트를 eventFilter로 받을 수 있음.
- main.cpp
#include "stdlib.h"
#include "QtExample.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.installEventFilter(new QEventFilter());
QtExample w;
w.show();
return a.exec();
}
4. QtExample 소스 작성
- QtExample.h
#pragma once
#include "ui_QtExample.h"
#include "stdlib.h"
class QtExample : public QMainWindow
{
Q_OBJECT
public:
QtExample(QWidget *parent = nullptr);
~QtExample();
private:
Ui::QtExampleClass ui;
private slots:
void pushButtonFunc(void);
};
- 간단하게 pushButton을 누를 시 printf와 label 설정하는 함수를 작성함.
- QtExample.cpp
#include "QtExample.h"
QtExample::QtExample(QWidget *parent) : QMainWindow(parent)
{
ui.setupUi(this);
setWindowTitle("QtExample");
connect(ui.pushButton, SIGNAL(clicked()), SLOT(pushButtonFunc()));
}
QtExample::~QtExample()
{
}
void QtExample::pushButtonFunc(void)
{
printf("push\n");
ui.label->setText("push");
}
5. QtExample.ui 구성
- pushButton, label 배치.

감사합니다.
잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다.
'GUI > C++ Qt' 카테고리의 다른 글
| [C++/QT] QRadioButton 체크 그룹 해제하기 (0) | 2022.07.03 |
|---|---|
| [C++/QT] ui 이벤트 처리 함수 (eventFilter) - 기본형 (0) | 2022.06.24 |
| [C++/QT] 프로그램 중복방지 (QSharedMemory) (0) | 2022.06.20 |
| [C++/QT] 프로젝트 만들기 (4step) (0) | 2022.06.19 |
| [C++/QT] ui 클래스 만들기(QWidget) (4step) (0) | 2022.06.17 |