Comment utiliser QKeySequence ou QKeySequenceEdit depuis QML?
Est-il possible d'utiliser un QKeySequence ou QKeySequenceEdit dans QML? Je ne vois que la documentation pour C ++https://doc.qt.io/qt-5/qkeysequence.html#details
Pour fournir un contexte, je veux qu'une QKeySequence soit entrée par l'utilisateur de l'application afin que je puisse la transmettre à mon backend C ++ afin que je puisse me connecter aux API natives du système d'exploitation et la sérialiser dans un fichier.
Je ne veux pas réellement établir le raccourci dans Qt.
Réponses
J'ai créé un nouvel objet qui enveloppe le QKeySequence::toStringet le rend disponible à partir de QML pour ne pas avoir à réimplémenter un cas de commutation massif dans 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;
}
}
};
Pour exposer cela dans QML, vous devez indiquer engine.rootContext()->setContextProperty("qmlUtil", new QmlUtil());dans votre main.cppemplacement où vous configurez votre QQmlEngine.
Ensuite, vous pouvez taper qmlUtil.keyToString(event.key, event.modifiers)QML pour transformer un événement clavier en chaîne.
Vous pouvez combiner cela avec la solution ici https://stackoverflow.com/a/64839234/353407 remplacer les cas individuels par un seul appel de fonction qmlUtil.keyToString
Vous pouvez définir une chaîne pour la sequencepropriété à partir de Shortcut, voir la documentation Qt .
Par exemple, si vous souhaitez enchaîner Ctrl+ Met Ctrl+ T, vous spécifiez ce qui suit:
Shortcut {
sequence: "cltr+m,ctrl+t"
onActivated: console.log("you activated turbo mode")
}
Il est même possible d'attribuer plusieurs raccourcis clavier à la même action, en utilisant la sequencespropriété (plural): Qt docs