2016-08-25 11 views
1

私は以下のような何かしようとしていたため、私は、すべての子ウィジェットのためのキープレスイベントを処理したい:Qtですべての子ウィジェットのkeypressイベントを処理する方法は?

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'を2回宣言してレイアウトに2回追加し、' gbox'にイベントフィルタを3回インストールしました。実際のコードを入力してください。 –

+0

いくつかのキーを押すと、ボタンにもフォーカスがありますか? – thuga

答えて

0

ウィンドウ全体を実装する必要がありますQShortcut、そして助けるべきウィジェットを決定するためにqApp->focusWidget()を使用してください。

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(); 
} 
関連する問題