Wie verwende ich QKeySequence oder QKeySequenceEdit aus QML?
Ist es möglich, eine QKeySequence oder QKeySequenceEdit in QML zu verwenden? Ich sehe nur die Dokumentation für C ++https://doc.qt.io/qt-5/qkeysequence.html#details
Um den Kontext bereitzustellen, möchte ich, dass der Benutzer der Anwendung eine QKeySequence eingibt, damit ich sie an mein C ++ - Backend übergeben kann, damit ich mich in native Betriebssystem-APIs einbinden und sie auch in eine Datei serialisieren kann.
Ich möchte die Verknüpfung nicht innerhalb von Qt einrichten.
Antworten
Ich habe ein neues Objekt erstellt, das das Objekt umschließt QKeySequence::toStringund über QML verfügbar macht, damit ich keinen massiven Switch-Case in QML erneut implementieren muss.
#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;
}
}
};
Um dies in QML verfügbar zu machen , müssen Sie engine.rootContext()->setContextProperty("qmlUtil", new QmlUtil());in main.cppIhrem Standort angeben, wo Sie Ihre QQmlEngine einrichten.
Anschließend können Sie qmlUtil.keyToString(event.key, event.modifiers)QML eingeben, um ein Tastaturereignis in eine Zeichenfolge umzuwandeln.
Das können Sie hier mit der Lösung kombinieren https://stackoverflow.com/a/64839234/353407 Ersetzen der Einzelfälle durch einen einzigen Funktionsaufruf an qmlUtil.keyToString
Sie können eine Zeichenfolge für die sequenceEigenschaft festlegen Shortcut, siehe Qt-Dokumente .
Wenn Sie beispielsweise Ctrl+ Mund Ctrl+ Tverketten möchten , geben Sie Folgendes an:
Shortcut {
sequence: "cltr+m,ctrl+t"
onActivated: console.log("you activated turbo mode")
}
Mit der sequencesEigenschaft (Plural): Qt docs können sogar mehrere Tastenkombinationen derselben Aktion zugewiesen werden