如何在Qt中实现快捷输入框

3
在像Qt Creator这样的软件中,您可以看到如下内容:
![image](https://istack.dev59.com/gTczT.webp)
基本上是一个框,当单击时会要求您按某个键盘组合键以记录快捷方式。
我应该如何在Qt中创建类似的东西? 我目前只能使用普通文本框来实现这一点,用户必须自己输入组合键,如果不正确,则会出现消息框,但如果用户不必输入 "ctrl + f2" 等内容,而是直接单击这些键,则会更加简单。
是否有任何适用于Qt的小部件来实现此功能?
2个回答

4

使用自Qt 5.2起可用的QKeySequenceEdit,它允许您记录类似于Qt Designer中的快捷键。


不幸的是,大多数Linux发行版对Qt5的支持非常差(据我所知,Ubuntu和Debian甚至还没有将其包含在默认仓库中)。 - Petr

3

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

  1. 读取用户输入
  2. 将其转换为易于理解的字符串
  3. 使用该字符串创建QKeySequence

该小部件记录多个快捷方式,与设计器中类似。可以通过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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接