2016-08-25 115 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); 
} 

但whwnever我按F1,只有somesignal()被髮射。我也想發出somesignal1()somesignal2(),對於button1button2

有人可以幫助我實現這個目標嗎?

+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(); 
} 
相關問題