2016-08-25 117 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(); 
} 
相关问题