C++ 如何在Qt中处理所有子窗口小部件的按键事件?

C++ 如何在Qt中处理所有子窗口小部件的按键事件?,c++,qt,widget,keyboard-events,qevent,C++,Qt,Widget,Keyboard Events,Qevent,我想处理所有子窗口小部件的按键事件,为此,我正在尝试以下操作: Widget::Widget(QWidget *parent):QWidget(parent) { QGroupBox *gBox = new QGroupBox(this); QPushButton *button1 = new QPushButton("1"); QPushButton *button2 = new QPushButton("2"); QVBoxLayout *vBox = n

我想处理所有子窗口小部件的按键事件,为此,我正在尝试以下操作:

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);
}
Widget::Widget(QWidget*parent):QWidget(parent)
{
QGroupBox*gBox=新的QGroupBox(本);
QPushButton*button1=新的QPushButton(“1”);
QPushButton*button2=新的QPushButton(“2”);
QVBoxLayout*vBox=新的QVBoxLayout;
vBox->addWidget(按钮1);
vBox->addWidget(按钮2);
gBox->setLayout(vBox);
gBox->installEventFilter(此);
按钮1->installEventFilter(此);
按钮2->installEventFilter(此);
}
bool小部件::事件过滤器(QObject*obj,QEvent*event)
{ 
如果(事件->类型()==QEvent::按键)
{
if(obj==gBox)
{
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key\u F1)
{
发出某种信号();
}
}
如果(对象==按钮1)
{
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key\u F1)
{
发出信号1();
}
}
如果(对象==按钮2)
{
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key\u F1)
{
发射信号2();
}
}
}
返回QObject::eventFilter(对象,事件);
}
但无论我按下F1键,都只会发出
somesignal()
。我还想发出
somesignal1()
somesignal2()
,用于
button1
button2


有人能帮我实现这一点吗?

您应该实现一个窗口全局
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();
}
const char kHelpUrl=“helpUrl”;
void setHelpUrl(QWidget*w、const-qrl和url){
w->setProperty(kHelpUrl,url);
}
QUrl getFocusedHelpUrl(){
自动w=qApp->focusWidget();
返回w?w->property(kHelpURL.value():QUrl{};
}
void showHelp(){
自动url=getFocusedHelpPurl();
...
}
MainWin类:公共QDialog{
...
QPushButton按钮1{“你好”};
QPushButton按钮2{“再见”};
公众:
MainWin(QWidget*parent=nullptr):QDialog{parent}
{
setHelpUrl(&button1,{”qthelp://button1"});
setHelpUrl(&button2,{”qthelp://button2"});
...
}
};
int main(int argc,字符**argv){
QApplication app{argc,argv};
...
mainWin;
qshortcuts{QKeySequence::HelpContents,&mainWin};
QObject::connect(&s,&QShortcut::已激活,显示帮助);
...
返回app.exec();
}

您应该实现一个窗口全局
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();
}
const char kHelpUrl=“helpUrl”;
void setHelpUrl(QWidget*w、const-qrl和url){
w->setProperty(kHelpUrl,url);
}
QUrl getFocusedHelpUrl(){
自动w=qApp->focusWidget();
返回w?w->property(kHelpURL.value():QUrl{};
}
void showHelp(){
自动url=getFocusedHelpPurl();
...
}
MainWin类:公共QDialog{
...
QPushButton按钮1{“你好”};
QPushButton按钮2{“再见”};
公众:
MainWin(QWidget*parent=nullptr):QDialog{parent}
{
setHelpUrl(&button1,{”qthelp://button1"});
setHelpUrl(&button2,{”qthelp://button2"});
...
}
};
int main(int argc,字符**argv){
QApplication app{argc,argv};
...
mainWin;
qshortcuts{QKeySequence::HelpContents,&mainWin};
QObject::connect(&s,&QShortcut::已激活,显示帮助);
...
返回app.exec();
}

您复制了
gBox->installEventFilter(此)3次。您已经声明了两次
按钮1
,将其添加到布局中两次,并在
gbox
上安装了三次事件筛选器。请提供实际代码。当您按下某些键时,按钮是否具有焦点?gbox、button1和button2是否是您的小部件的成员?如果是这样的话,你在构造器中再次声明了它们。你到底想在这里实现什么?关于这个目的的一些细节会很好。到目前为止似乎是一个错误。您复制了
gBox->installEventFilter(此)3次。您已经声明了两次
按钮1
,将其添加到布局中两次,并在
gbox
上安装了三次事件筛选器。请提供实际代码。当您按下某些键时,按钮是否具有焦点?gbox、button1和button2是否是您的小部件的成员?如果是这样的话,你在构造器中再次声明了它们。你到底想在这里实现什么?关于这个目的的一些细节会很好。到目前为止,这似乎是个好主意。