Как перехватить событие нажатия клавиш Ctrl + C с помощью Qt, когда Ctrl отпускается до «C»? - PullRequest
1 голос
/ 18 июля 2009

Я хотел бы вызвать какой-нибудь пользовательский код копирования, когда пользователь отпускает Ctrl + C . Когда C освобождается до Ctrl , Qt отправляет ключевое событие, которое совпадает с QKeySequence::Copy. Когда Ctrl выпущен до C , событие освобождения не совпадает.

Когда событие отпускания ключа наступает с Ctrl , есть ли способ узнать, удерживается ли C все еще в нажатом состоянии?

Когда я не обрабатываю Ctrl , который был выпущен первым, событие передается и выполняется обычное копирование, а это именно то, чего я не хочу.

bool
MyWidget::eventFilter(QObject* object, QEvent* event)
{
   // the text edit box filters its events through here
   if (object == m_text_edit_box)
   {
      if (event->type() == QEvent::KeyPress)
      {
         QKeyEvent *key_event = static_cast<QKeyEvent*>(event);

         if (key_event->matches(QKeySequence::Copy))
         {
            // don't do anything and don't pass along event
            return true;
         }
      }
      else if (event->type() == QEvent::KeyRelease)
      {
         QKeyEvent *key_event = static_cast<QKeyEvent*>(event);

         if (key_event->matches(QKeySequence::Copy))
         {
            // we only get in here if 'c' is released before ctrl
            callCustomCopy();
            return true;
         }
      }
   }

   // pass along event
   return false;
}

1 Ответ

1 голос
/ 18 июля 2009

Вы можете запросить букву 'C' и мета-ключ 'Ctrl' специально, и не полагаться на key_even-> match (). Вы, конечно, можете в объекте, где вы разместили фильтр событий в событии keydown, сохранить факт совпадения последовательности нажатий клавиш.

Это (не проверено) может работать для вас, обратите внимание, что статическая переменная должна быть переменной-членом класса, в котором она содержится, это просто показалось более понятным в контексте этого примера. Точная логика того, что вы хотите выполнить, может потребовать больше информации о состоянии для переноса между событиями.

bool MyWidget::eventFilter(QObject* object, QEvent* event)
{
  // Remember state between events
  static foundCopy = false;
  // the text edit box filters its events through here
  if (object == m_text_edit_box)
  {
    if (event->type() == QEvent::KeyPress)
    {
    QKeyEvent *key_event = static_cast<QKeyEvent*>(event);
      if (key_event->matches(QKeySequence::Copy))
      {
        foundCopy = true;
        // don't do anything and don't pass along event
        return true;
      }
      else
      {
        foundCopy = false;
        // This is another sequence, ignore and pass event
        // Note that this will trigger with ctrl+c+a and others

      }
    }
    else if (event->type() == QEvent::KeyRelease)
    {
      QKeyEvent *key_event = static_cast<QKeyEvent*>(event);
      if (foundCopy)
      {
        callCustomCopy();
        foundCopy = false;
        return true;
      }
      // This should keep the system copy from triggering
      if (key_event->matches(QKeySequence::Copy))
      {
        return true;
      }
    }
  }

   // pass along event
 return false;
}

Другим способом было бы собрать фактическое состояние всех нажатых клавиш в текущий момент времени, а затем, когда одна из них отпущена, посмотреть, какие из них все еще нажаты.

С точки зрения пользовательского интерфейса, имейте в виду, что все действия с клавиатурой выполняются при нажатии (например, при наборе текста, вставке окон), выполнение действий при отпускании в целом может сбить пользователя с толку, особенно когда есть видимый результат для действие. Я не могу сказать из вашего примера, что вы пытаетесь достичь.

...