简体   繁体   English

Qt:显示 QCompleter 时,eventFilter 未收到 KeyPress

[英]Qt: eventFilter does not recieve KeyPress when QCompleter is shown

I have an subclassed QPlainTextEdit called Editor.我有一个名为 Editor 的子类 QPlainTextEdit。 The editor contains an object used to suggest text, called a Suggester.编辑器包含一个用于建议文本的 object,称为 Suggester。 The user can press a button from the Suggester to show a QCompleter, the activeCompleter.用户可以从 Suggester 中按下一个按钮来显示一个 QCompleter,即 activeCompleter。

I need to mess with the activeCompleter when KeyPress events come in from the Editor, so in Suggester, I create an eventFilter and install it to the passed in Editor instance.当 KeyPress 事件从编辑器传入时,我需要弄乱 activeCompleter,因此在 Suggester 中,我创建了一个 eventFilter 并将其安装到传入的编辑器实例中。

When the activeCompleter is not shown, the eventFilter receives the KeyPress events as expected.当 activeCompleter 未显示时,eventFilter 会按预期接收 KeyPress 事件。 However, when the activeComplter is shown via activeComplter->complete(), the eventFilter does not recieve KeyPress events (the editor behaves however).但是,当通过 activeComplter->complete() 显示 activeComplter 时,eventFilter 不会接收 KeyPress 事件(但是编辑器会运行)。

I don't understand why this is.我不明白这是为什么。 The QCompleter is not a widget. QCompleter 不是小部件。 The Editor retains focus.编辑器保持焦点。 I do not intercept events or keys anywhere else.我不会在其他任何地方拦截事件或键。

Why is my eventFilter not receiving KeyPress events?为什么我的 eventFilter 没有收到 KeyPress 事件?

relevant code...相关代码...

Editor::Editor(QWidget *parent) : QPlainTextEdit(parent){
    suggester = new Suggester(this);
}

Suggester::Suggester(Editor* editor){
    this->editor = editor;
    editor->installEventFilter(this);
}

bool Suggester::eventFilter(QObject *obj, QEvent *event){
    qDebug()<< "event filter of type " << event->type() << " from " << obj;
    return false;
}

It seems that your eventFilter member is incomplete.您的 eventFilter 成员似乎不完整。 You have to filter the QEvent:KeyPress event as follows:您必须按如下方式过滤 QEvent:KeyPress 事件:

  bool Suggester::eventFilter(QObject *obj, QEvent *event)
  {
      if (obj == textEdit) {
          if (event->type() == QEvent::KeyPress) {
              QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
              qDebug() << "Ate key press" << keyEvent->key();
              return true;
          } else {
              return false;
          }
      } else {
          // pass the event on to the parent class
          return Suggester::eventFilter(obj, event);
      }
  }      

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM