각 Widget의 Event를 처리하기 위해서 subclass를 이용해서 class를 만들어 사용하는 것 보다 eventFilter(QObject* object, QEvent* event)함수를 이용하는 것이 개발을 빨리 진행할 수 있다.
Dialog에 Widget을 배치하고 Dialog class의 생성자에 필요한 Widget별로 installEventFilter()함수를 설정한다.
ex)
QLineEdit Widget을 사용하는데 Key Event를 확인하고 싶을 경우에는 아래와 같이 생성장에 설정을 한다.
QLineEdit *ed = new QLineEdit(this);
ed->installEventFilter(this);
bool Dialog::eventFilter(QObject* object, QEvent* event)
{
if (object == ed) {
QEvent::Type type = event->type();
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Enter) {
fileSaveClick();
return true;
}
}
}
return QDialog::eventFilter(object, event);
}
return을 할 때 false를 하면 Dialog에서 기존과 같이 처리가 된다. 따라서 내가 원하는 방식을 처리하고 기존 방식을 처리하지 않게 하기 위해서는 true를 리턴해야 한다.
<주의>
QTableWidget은 object를 가지고 하면 안된다.위젯 내부에 있는 viewport()에 installEventFilter(this)를 해야 우리가 윈하는 이벤트를 처리할 수 있다.
QTableWidget *tw = new QTableWidget(this);
tw->viewport()->installEventFilter(this);
또한 MouseMove event를 처리하기 위해서는 widget에 setMouseTracking( true )를 설정 해줘야 한다.
'QT and Symbian' 카테고리의 다른 글
QT PostMessage 대체 사용 방법 고민 (0) | 2015.12.30 |
---|---|
Transition from Qt 4.x to Qt5 (toAscii() to toLatin1()) (0) | 2015.12.24 |
QTableWidget의 Item은 clear()함수로 메모리 누수 없이 삭제가 된다. (0) | 2015.07.20 |
QT release compile error (LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘2’ doesn’t match value ‘0’) (0) | 2015.07.03 |
QT right-click으로 popup menu 사용하기 (0) | 2015.06.18 |