在QML中可以使用QKeySequence或QKeySequenceEdit吗?我只看到了C++ https://doc.qt.io/qt-5/qkeysequence.html#details的文档
为了提供上下文,我希望应用程序的用户输入一个QKeySequence,这样我就可以将它传递给我的C++后端,这样我就可以连接到本地OS并将它序列化为文件。
我不想在Qt中实际建立快捷方式。
发布于 2020-11-16 17:41:54
我创建了一个新的对象,它封装了QKeySequence::toString并使它可以从QML中获得,这样我就不必在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;
}
}
};要在QML中公开这一点,必须在设置engine.rootContext()->setContextProperty("qmlUtil", new QmlUtil());的main.cpp中使用QQmlEngine。
然后,您可以在QML中键入qmlUtil.keyToString(event.key, event.modifiers),将键盘事件转换为字符串。
您可以将其与这里的解决方案结合起来,https://stackoverflow.com/a/64839234/353407将个别情况替换为对qmlUtil.keyToString的单个函数调用
https://stackoverflow.com/questions/64826271
复制相似问题