簡體   English   中英

如何在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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM