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

时间:2015-02-23 08:56:42

标签: c++ qt shortcut

在像qtcreator这样的软件中你可以看到这样的事情:

enter image description here

基本上有些盒子在点击时会要求你按某些键盘组合以便记录快捷方式。

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

是否有任何Qt小部件?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

    小部件记录多个快捷方式,例如在Designer中。可以通过删除或退格键清除快捷方式。

    #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
    }