2

我希望当它只是一个被按下的修饰键时QKeyEvent 不执行孩子的处理。下面的代码完成了这项工作,但是这样列出它们很笨拙。有没有内置的方法可以做到这一点?

void TextEditor::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
    case Qt::Key_Shift:
    case Qt::Key_Control:
    case Qt::Key_Alt:
    case Qt::Key_Meta:
    case Qt::Key_Mode_switch:
        return QPlainTextEdit::keyPressEvent(event);
    }

    // handle the event...
}
4

2 回答 2

2

您可以为此目的使用此QKeyEvent::modifiers()成员。如果结果是

const bool isModifier = ( event->modifiers() != Qt::NoModifier );

true 那么按下的键是一个修饰符。

因此,对于您的代码,这意味着以下修改。

void TextEditor::keyPressEvent( QKeyEvent* event )
{
    if ( event->modifiers() != Qt::NoModifier )
    {
        return QPlainTextEdit::keyPressEvent(event);
    }

    // Handle the event ...
}

或者,如果您想处理一些特殊的组合键,为什么不直接使用这种方式:

void TextEditor::keyPressEvent( QKeyEvent* aKeyEvent )
{
    if ( aKeyEvent->matches( QKeySequence::Copy ) )
    {
        // Your copy stuff ...
        return;
    }
    // else if ( aKeyEvent->matches( ... ) ) // Other key combinations ...

    return QPlainTextEdit::keyPressEvent( aKeyEvent);
}
于 2015-05-15T21:14:13.033 回答
1

一个更好的方法在 3 行中做到这一点:

if(event->modifiers()){
   event->ignore(); // or don't ignore and handle the event 
                    // switching the modifiers
}

这是 qt 定义的修饰符:

Qt::NoModifier  
Qt::ShiftModifier   
Qt::ControlModifier
Qt::AltModifier 
Qt::MetaModifier    
Qt::KeypadModifier  
Qt::GroupSwitchModifier

你可以做一个过滤开关。

于 2015-05-16T03:12:17.220 回答