Como usar QKeySequence ou QKeySequenceEdit do QML?
É possível usar um QKeySequence ou QKeySequenceEdit em QML? Eu só vejo a documentação para C ++https://doc.qt.io/qt-5/qkeysequence.html#details
Para fornecer contexto, quero que um QKeySequence seja inserido pelo usuário do aplicativo para que eu possa passá-lo para meu back-end C ++ para que eu possa conectar em APIs de SO nativos e também serializá-lo em arquivo.
Eu não quero estabelecer o atalho dentro do Qt.
Respostas
Eu criei um novo objeto que envolve o QKeySequence::toStringe o torna disponível a partir de QML, para que não precise reimplementar um caso de switch massivo em 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 expor isso em QML, você tem a dizer engine.rootContext()->setContextProperty("qmlUtil", new QmlUtil());em sua main.cpponde você estiver configurando o seu QQmlEngine.
Então você pode digitar qmlUtil.keyToString(event.key, event.modifiers)QML para transformar um evento de teclado em uma string.
Você pode combinar isso com a solução aqui https://stackoverflow.com/a/64839234/353407 substituindo os casos individuais por uma única chamada de função para qmlUtil.keyToString
Você pode definir uma string para a sequencepropriedade de Shortcut, consulte a documentação do Qt .
Por exemplo, se você deseja encadear Ctrl+ Me Ctrl+ T, você especifica o seguinte:
Shortcut {
sequence: "cltr+m,ctrl+t"
onActivated: console.log("you activated turbo mode")
}
É ainda possível atribuir vários atalhos de teclado para a mesma ação, usando a sequencespropriedade (plural): documentos Qt