Вы можете запросить букву '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;
}
Другим способом было бы собрать фактическое состояние всех нажатых клавиш в текущий момент времени, а затем, когда одна из них отпущена, посмотреть, какие из них все еще нажаты.
С точки зрения пользовательского интерфейса, имейте в виду, что все действия с клавиатурой выполняются при нажатии (например, при наборе текста, вставке окон), выполнение действий при отпускании в целом может сбить пользователя с толку, особенно когда есть видимый результат для действие. Я не могу сказать из вашего примера, что вы пытаетесь достичь.