반응형


사용자의 UI 조작에 따라 기능동작할 수 있도록 이벤트 처리 코드를 구현한다.

수많은 UI와 클래스, 화면탭, 단축키, 마우스조작방법, 동시 키실행 등이 있는 경우 각 UI클래스마다 이벤트 처리를 해주어야 할 것들이 많다.

위와 같은 코드 복잡성 증가를 줄이기 위해 각 코드마다 유지보수를 쉽게 할 수 있고, 모든 이벤트들을 처리할 수 있는 함수로 구성된 클래스를 만들 것다.


 

# 참고자료

 

#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 배치.

 


감사합니다.

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


 

반응형

+ Recent posts