Antes de activar un atajo, el widget de enfoque recibe un evento ShortcutOverride. Si se acepta el evento, el evento clave se transfiere al widget y el acceso directo no se activa.
Fuente: https://wiki.qt.io/ShortcutOverride
En cuanto a la fuente de Qt
QAbstractSpinBox::event(QEvent *event)
{
Q_D(QAbstractSpinBox);
switch (event->type()) {
...
case QEvent::ShortcutOverride:
if (d->edit->event(event))
return true;
break;
...
}
return QWidget::event(event);
}
QAbstractSpinBox es permitir la edición interno para aceptar el caso. QLineEdit se remite a QLineControl. De qt/src/gui/widgets/qlinecontrol.cpp
case QEvent::ShortcutOverride:{
if (isReadOnly())
return false;
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
if (ke == QKeySequence::Copy
|| ke == QKeySequence::Paste
|| ke == QKeySequence::Cut
|| ke == QKeySequence::Redo
|| ke == QKeySequence::Undo
|| ke == QKeySequence::MoveToNextWord
|| ke == QKeySequence::MoveToPreviousWord
|| ke == QKeySequence::MoveToStartOfDocument
|| ke == QKeySequence::MoveToEndOfDocument
|| ke == QKeySequence::SelectNextWord
|| ke == QKeySequence::SelectPreviousWord
|| ke == QKeySequence::SelectStartOfLine
|| ke == QKeySequence::SelectEndOfLine
|| ke == QKeySequence::SelectStartOfBlock
|| ke == QKeySequence::SelectEndOfBlock
|| ke == QKeySequence::SelectStartOfDocument
|| ke == QKeySequence::SelectAll
|| ke == QKeySequence::SelectEndOfDocument) {
ke->accept();
} else if (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier
|| ke->modifiers() == Qt::KeypadModifier) {
if (ke->key() < Qt::Key_Escape) {
ke->accept();
} else {
switch (ke->key()) {
case Qt::Key_Delete:
case Qt::Key_Home:
case Qt::Key_End:
case Qt::Key_Backspace:
case Qt::Key_Left:
case Qt::Key_Right:
ke->accept();
default:
break;
}
}
}
}
Este código acepta la mayoría de las llaves si no está también presionó la tecla de control.
Así que la solución más fácil es cambiar el atajo para incluir el modificador de control.
Como alternativa, puede subclase el cuadro de giro y anular la función de eventos
bool MySpinBox::event(QEvent *event)
{
if(event->type() == QEvent::ShortcutOverride && !isReadOnly())
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
// Ignore 'B' shortcuts
if(keyEvent->key() == Qt::Key_B)
{
Q_ASSERT(!event->isAccepted());
return true;
}
return QSpinBox::event(event);
}
Gracias por su respuesta. ¿Tienes alguna idea de cómo resolver este problema? Me refiero a cómo eliminar keyboard_focus automáticamente de QSpinBox después de cada "clic"? – Marwroc
@Marwroc Actualicé la respuesta. ¿Has probado 'QShortcut :: setContext' aún? –
Sí, he probado ambas opciones, pero todavía no funciona;/He leído algo sobre setFocusPolicy() pero no estoy seguro de cómo usarlo y si es la solución. – Marwroc