Saltar al contenido

Convertir string representación del código clave a Qt::Key (o cualquier int) y viceversa

Agradeceríamos tu apoyo para difundir nuestras crónicas sobre las ciencias informáticas.

Solución:

Ya estabas en el camino correcto mirando QKeySequenceya que esto se puede utilizar para convertir entre string y key códigos:

QKeySequence seq = QKeySequence("SPACE");
qDebug() << seq.count(); // 1

// If the sequence contained more than one key, you
// could loop over them. But there is only one here.
uint keyCode = seq[0]; 
bool isSpace = keyCode==Qt::Key_Space;
qDebug() << keyCode << isSpace;  // 32 true

QString keyStr = seq.toString().toUpper();
qDebug() << keyStr;  // "SPACE"

agregado por OP

Lo anterior no admite modificador. keys como Ctrl, Alt, Shift, etc. Desafortunadamente, QKeySequence no reconoce un Ctrl key por sí mismo como un key. Entonces, para admitir el modificador keysdebes dividir el string representación usando el signo "+" y luego procesar por separado cada subcadena. La siguiente es la función completa:

QVector EmoKey::splitKeys(const QString &comb)

    QVector keys;
    const auto keyList = comb.split('+');
    for (const auto &key: keyList) 
        if (0 == key.compare("Alt", Qt::CaseInsensitive)) 
            keys << Qt::Key_Alt;
         else if (0 == key.compare("Ctrl", Qt::CaseInsensitive)) 
            keys << Qt::Key_Control;
         else if (0 == key.compare("Shift", Qt::CaseInsensitive)) 
            keys << Qt::Key_Shift;
         else if (0 == key.compare("Meta", Qt::CaseInsensitive)) 
            keys << Qt::Key_Meta;
         else 
            const QKeySequence keySeq(key);
            if (1 == keySeq.count()) 
                keys << keySeq[0];
            
        
    
    return keys;

Eres capaz de añadir valor a nuestra información aportando tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *