【问题标题】:How to handle keypress event for all child widgets, in Qt?如何在 Qt 中处理所有子小部件的按键事件?
【发布时间】:2017-01-01 13:46:02
【问题描述】:

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

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 时,只会发出 somesignal()。我还想为button1button2 发出somesignal1()somesignal2()

谁能帮我实现这个目标?

【问题讨论】:

  • 你复制了gBox-&gt;installEventFilter(this); 3 次。
  • 您已经声明了两次button1,两次将其添加到布局中,并在gbox 上安装了三次事件过滤器。请提供实际代码。
  • 按下某些键时按钮是否有焦点?
  • gbox、button1 和 button2 是 Widget 的成员吗?如果是这样,您在构造函数中再次声明它们。
  • 你想在这里完成什么?关于这样做的目的的一些细节会很好。到目前为止似乎是XY problem

标签: c++ qt widget keyboard-events qevent


【解决方案1】:

您应该实现一个窗口全局QShortcut,并使用qApp-&gt;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();
}

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 2013-07-04
    • 2012-06-12
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多