Qt_GUI_IM_2_3 - 8BitsCoding/RobotMentor GitHub Wiki
- QWidget Mouse Event 처리
- QWidget Close Event 처리
- 매번 Event를 다 외우고 사용해야 할까?
- 마우스 우클릭시 메뉴 전시하기
- 마우스가 다이얼로그 위로 올 경우 (enterEvent)
- 마우스가 다이얼로그 밖으로 나갈 경우 (LeaveEvent)
마우스 처리 등등의 Event를 어떻게 처리하는지 학습한다.
우선 QWidget의 Event처리를 어떻게 하는지 확인해야한다.
QWidget 설명페이지에 가보면 아래와 같이 Protected Functions에 대한 설명이 있다.
그 중 하나인
mousePressEvent
를 사용해 보자.
#pragma once
#include <QtWidgets/QWidget>
#include "ui_EventDemo.h"
class EventDemo : public QWidget
{
Q_OBJECT
public:
explicit EventDemo(QWidget *parent = Q_NULLPTR);
~EventDemo() override;
protected:
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
private:
Ui::EventDemoClass ui;
};
#include "EventDemo.h"
#include <qdebug.h>
EventDemo::EventDemo(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
EventDemo::~EventDemo()
{
}
void EventDemo::mousePressEvent(QMouseEvent* event)
{
qDebug() << "Mouse Pressed";
}
void EventDemo::mouseReleaseEvent(QMouseEvent* event)
{
qDebug() << "Mouse Release";
}
void EventDemo::mouseMoveEvent(QMouseEvent* event)
{
qDebug() << "Mouse Move";
}
좀 더 event의 상세한 부분을 전시하고 싶다면?
#include "EventDemo.h"
#include <qdebug.h>
#include <qevent.h>
EventDemo::EventDemo(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
EventDemo::~EventDemo()
{
}
void EventDemo::mousePressEvent(QMouseEvent* event)
{
qDebug() << "Mouse Pressed" << event->pos();
}
void EventDemo::mouseReleaseEvent(QMouseEvent* event)
{
qDebug() << "Mouse Release" << event->pos();
}
void EventDemo::mouseMoveEvent(QMouseEvent* event)
{
qDebug() << "Mouse Move" << event->pos();
}
// .h
void closeEvent(QCloseEvent* event) override;
// .cpp
void EventDemo::closeEvent(QCloseEvent* event)
{
qDebug() << "Widget about to close";
event->ignore(); // 화면이 종료되지 않는다.
// event->accept();
}
Qt Creator를 사용하면 외우지 않아도 된다.
Qt Creator에서 해당 클래스를 우클릭 후 Refactor -> Insert Virtual Functions of Base Classes로 들어간다.
원하는 클래스를 선택한다.
추가적으로 모르는 부분이 있다면 F1을 누른 후
위와 같이 설명을 참고 할 수 있다.
void Widget::contextMenuEvent(QContext* event)
{
qDebug() << "ContextMenu event";
QMenu* mMenu = new QMenu(this);
mMenu->addAction(tr("Action1"));
mMenu->addAction(tr("Action2"));
// mMenu->popup(event->pos());
// 이렇게 전시할 경우 이상한데 메뉴가 뜬다.(윈도우 창 밖에 뜸.)
mMenu->popup(mapToGlobal(event->pos()));
}
void enterEvent(QEvent* event) override;
void LeaveEvent(QEvent* event) override;
기타 등등... 이벤트 처리