QDialog를 상속받은 대화 상자가 있습니다. 대화 상자에는 Qbuttons, QLabel, QGraphicsView 등을 포함한 많은 위젯이 있습니다. 버튼과 같은 많은 위젯은 포커스를받을 때 SPACE 키 누름 이벤트를 처리 할 수 있습니다. 이제 나는 자식 위젯이 그것을 처리하는 것을 원하지 않지만, 메인 대화 상자는 그렇게하겠습니다. 메인 대화 상자에는 많은 위젯이 있으므로 intallEventFilter를 사용하지 않고 qApp를 사용했습니다. 다음과 같은자식 위젯 대신 키 이벤트를 처리하는 Qt 대화 상자를 만드는 방법은 무엇입니까?
코드 :
QApplication app(argc, 0);
MyDialog *pDlg = new MyDialog(...);
qApp->installEventFilter(pDlg);
app.exec();
그리고 기본 대화 상자의 eventfilter는 :
bool MyDialog::eventFilter(QObject *obj, QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->key == Qt::Key_Space && !ke->isAutoRepeat())
{
// do my things in the main dialog
return true;
}
}
return qApp->eventFilter(watched, event);
}
불행하게도,이 코드를 사용 후, 주 대화 상자의 레이아웃은 호기심, 일부 위젯이 기억하지 않은 것 같습니다 자신의 크기 정책. 어쩌면 일부 Qt의 크기를 조정하거나 다시 칠하는 이벤트가 처리되지 않았을 수 있습니까? 어떤 사람이 주 대화 상자에서 키 이벤트를 잡는 방법을 알려줄 수 있습니까? 그러나 다른 기능에는 영향을주지 않습니까?
위젯 (예 : 버튼)이 포커스를 얻은 다음 키를 누르면 포커스가있는 위젯의 keyPress 이벤트가 호출되고 해당 부모를 처리하지 않습니다. 아마도 qApp가 올바른 대상 (집중 위젯)으로 이벤트를 보냅니다. – Royt
나는 내 대답을 편집하고 그것을 확인했다. – ScarCode
답장을 보내 주셔서 감사합니다. 어린이 위젯의 이벤트 처리 메소드를 덮어 쓰거나 이벤트 필터가 설치할 수 있도록 설치하십시오. 하지만 주된 딜록에서는 많은 위젯이 있으므로 많은 코드가 작성되고 구조가 좋지 않습니다. 나는 모든 사건들이 파견 될 준비가되어있는 핵심 사건을 처리해야한다고 생각한다. – Royt