Qt中如何实现快捷输入框

How to implement shortcut input box in Qt

在qtcreator这样的软件中你可以看到这样的东西:

基本上是一些框,点击后会要求您按一些键盘组合以记录快捷方式。

如何在 Qt 中创建类似的东西?到目前为止,我只能使用常规文本框来实现这一点,用户必须自己在其中键入组合,如果出现不正确的消息框,但如果用户不必键入内容会简单得多喜欢 "ctrl + f2" 但点击这些键。

是否有任何 Qt 小部件?

使用 QKeySequenceEdit,自 Qt 5.2 起可用。它允许您像在 Qt Designer 中一样记录快捷键。

如果您需要 Qt 的小部件 4.x,我之前已经实现了一个。三个关键部分是:

  1. 读取用户输入
  2. 将其转换为人类可读的字符串
  3. 使用字符串创建 QKeySequence

小部件记录了多个快捷方式,就像在 Designer 中一样。可以通过 Delete 或 Backspace 清除快捷方式。

#define MAX_SHORTCUTS 3

QString ShortcutLineEdit::keyEventToString(QKeyEvent *e)
{
    int keyInt = e->key();
    QString seqStr = QKeySequence(e->key()).toString();

    if (seqStr.isEmpty() ||
        keyInt == Qt::Key_Control ||
        keyInt == Qt::Key_Alt || keyInt == Qt::Key_AltGr ||
        keyInt == Qt::Key_Meta ||
        keyInt == Qt::Key_Shift)
    {
        return "";
    }

    QStringList sequenceStr;
    if (e->modifiers() & Qt::ControlModifier)
        sequenceStr << "Ctrl";
    if (e->modifiers() & Qt::AltModifier)
        sequenceStr << "Alt";
    if (e->modifiers() & Qt::ShiftModifier)
        sequenceStr << "Shift";
    if (e->modifiers() & Qt::MetaModifier)
        sequenceStr << "Meta";

    return sequenceStr.join("+") + (sequenceStr.isEmpty() ? "" : "+") + seqStr;
}


void ShortcutLineEdit::keyPressEvent(QKeyEvent *e)
{
    QString text =text();
    int keyInt = e->key();
    bool modifiers = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier | Qt::MetaModifier);

    if (!modifiers && (keyInt == Qt::Key_Delete || keyInt == Qt::Key_Backspace)) {
        setText("");
        return;
    }

    QString sequenceStr = keyEventToString(e);
    if (sequenceStr == "") {
        QLineEdit::keyPressEvent(e);
        return;
    }

    if (text.split(", ").size() >= MAX_SHORTCUTS)
        text = "";

    if (!text.isEmpty())
        text += ", ";

    setText(text + sequenceStr);
}

void ShortcutLineEdit::apply()
{
    QList<QKeySequence> sequenceList;
    QStringList sequenceStrList = text().split(", ");
    foreach (QString str, sequenceStrList)
        sequenceList << QKeySequence(str);

    // use sequenceList somehow
}