2016-08-25 11 views
1

는 내가 아래와 같이 뭔가를 시도하고있는 모든 자식 위젯에 대한 키 누르기 이벤트를 처리 할 :Qt의 모든 하위 위젯에 대한 키 누르기 이벤트를 처리하는 방법은 무엇입니까?

Widget::Widget(QWidget *parent):QWidget(parent) 
{ 
    QGroupBox *gBox = new QGroupBox(this); 

    QPushButton *button1 = new QPushButton("1"); 
    QPushButton *button2 = new QPushButton("2"); 

    QVBoxLayout *vBox = new QVBoxLayout; 
    vBox->addWidget(button1); 
    vBox->addWidget(button2); 
    gBox->setLayout(vBox); 

    gBox->installEventFilter(this); 
    button1->installEventFilter(this); 
    button2->installEventFilter(this); 
} 

bool Widget::eventFilter(QObject *obj, QEvent *event) 
{ 
if (event->type() == QEvent::KeyPress) 
{ 
    if(obj == gBox) 
    { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if(keyEvent->key() == Qt::Key_F1) 
     { 
      emit somesignal(); 
     } 
    } 
    if(obj == button1) 
    { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if(keyEvent->key() == Qt::Key_F1) 
     { 
      emit somesignal1(); 
     } 
    } 
    if(obj == button2) 
    { 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
     if(keyEvent->key() == Qt::Key_F1) 
     { 
      emit somesignal2(); 
     } 
    } 
} 
return QObject::eventFilter(obj, event); 
} 

을하지만 F1을 눌러 whwnever 만 somesignal()이 방출된다. button1button2에 대해서도 somesignal1(), somesignal2()을 내고 싶습니다.

누가이 문제를 해결할 수 있습니까?

+3

'gBox-> installEventFilter (this);를 3 번 ​​복제했습니다. – ilotXXI

+2

'button1'을 두 번 선언하고 레이아웃에 두 번 추가하고'gbox'에 이벤트 필터를 세 번 설치했습니다. 실제 코드를 입력하십시오. –

+0

일부 키를 누를 때 버튼에 포커스가 있습니까? – thuga

답변

0

윈도우 전역을 구현하고 QShortcut을 구현하고 qApp->focusWidget()을 사용하여 도움이 필요한 위젯을 결정해야합니다. 속성 프레임 워크를 사용하여 위젯의 도움말 URL을 설정해야합니다 :

const char kHelpUrl = "helpUrl"; 

void setHelpUrl(QWidget * w, const QUrl & url) { 
    w->setProperty(kHelpUrl, url); 
} 
QUrl getFocusedHelpUrl() { 
    auto w = qApp->focusWidget(); 
    return w ? w->property(kHelpURL).value<QUrl>() : QUrl{}; 
} 

void showHelp() { 
    auto url = getFocusedHelpUrl(); 
    ... 
} 

class MainWin : public QDialog { 
    ... 
    QPushButton button1{"Hello"}; 
    QPushButton button2{"GoodBye"}; 
public: 
    MainWin(QWidget * parent = nullptr) : QDialog{parent} 
    { 
    setHelpUrl(&button1, {"qthelp://button1"}); 
    setHelpUrl(&button2, {"qthelp://button2"}); 
    ... 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    ... 
    MainWindow mainWin; 
    QShortcut s{QKeySequence::HelpContents, &mainWin}; 
    QObject::connect(&s, &QShortcut::activated, showHelp); 
    ... 
    return app.exec(); 
}