¿Cómo usar QKeySequence o QKeySequenceEdit de QML?
¿Es posible utilizar QKeySequence o QKeySequenceEdit en QML? Solo veo la documentación para C ++https://doc.qt.io/qt-5/qkeysequence.html#details
Para proporcionar contexto, quiero que el usuario de la aplicación introduzca una QKeySequence para poder pasarla a mi backend de C ++ para poder conectarme a las API nativas del sistema operativo y también serializarlo en el archivo.
En realidad, no quiero establecer el acceso directo dentro de Qt.
Respuestas
Creé un nuevo objeto que envuelve el QKeySequence::toStringy lo hace disponible desde QML para no tener que volver a implementar un cambio masivo en QML.
#ifndef QMLUTIL_H
#define QMLUTIL_H
#include <QObject>
#include <QKeySequence>
// A singleton object to implement C++ functions that can be called from QML
class QmlUtil : public QObject{
Q_OBJECT
public:
Q_INVOKABLE bool isKeyUnknown(const int key) {
// weird key codes that appear when modifiers
// are pressed without accompanying standard keys
constexpr int NO_KEY_LOW = 16777248;
constexpr int NO_KEY_HIGH = 16777251;
if (NO_KEY_LOW <= key && key <= NO_KEY_HIGH) {
return true;
}
if (key == Qt::Key_unknown) {
return true;
}
return false;
}
Q_INVOKABLE QString keyToString(const int key, const int modifiers){
if (!isKeyUnknown(key)) {
return QKeySequence(key | modifiers).toString();
} else {
// Change to "Ctrl+[garbage]" to "Ctrl+_"
QString modifierOnlyString = QKeySequence(Qt::Key_Underscore | modifiers).toString();
// Change "Ctrl+_" to "Ctrl+..."
modifierOnlyString.replace("_", "...");
return modifierOnlyString;
}
}
};
Para exponer esto en QML, debe decir engine.rootContext()->setContextProperty("qmlUtil", new QmlUtil());en su lugar main.cppdonde está configurando su QQmlEngine.
Luego, puede escribir qmlUtil.keyToString(event.key, event.modifiers)QML para convertir un evento de teclado en una cadena.
Puedes combinar eso con la solución aquí. https://stackoverflow.com/a/64839234/353407 Reemplazar los casos individuales con una sola llamada de función para qmlUtil.keyToString
Puede establecer una cadena a la sequencepropiedad desde Shortcut, consulte Qt docs .
Por ejemplo, si desea encadenar Ctrl+ My Ctrl+ T, especifique lo siguiente:
Shortcut {
sequence: "cltr+m,ctrl+t"
onActivated: console.log("you activated turbo mode")
}
Incluso es posible asignar múltiples atajos de teclado a la misma acción, usando la sequencespropiedad (plural): Qt docs