Wie verwende ich QKeySequence oder QKeySequenceEdit aus QML?

Nov 13 2020

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

1 Mark Nov 16 2020 at 17:41

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

Amfasis Nov 13 2020 at 19:07

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