簡體   English   中英

將 QKeySequence/QKeySequenceEdit 限制為只有一個快捷方式

[英]Limit QKeySequence/QKeySequenceEdit to only one shortcut

是否可以限制QKeySequenceQKeySequenceEdit中僅顯示一個快捷方式? 目前它支持多達 4 個快捷方式。 我的應用程序僅支持一個快捷鍵的鍵序列,例如Ctrl+ACtrl+C而不是例如Ctrl+A, DCtrl+C, X, Z

是否可以將QKeySequenceQKeySequenceEdit限制為一個鍵序列?

解決了它,不是最好的解決方案,而是快速的解決方案。。。

customkeysequenceedit.h

#ifndef CUSTOMKEYSEQUENCEEDIT_H
#define CUSTOMKEYSEQUENCEEDIT_H

#include <QKeySequenceEdit>

class QKeyEvent;

class CustomKeySequenceEdit : public QKeySequenceEdit
{
    Q_OBJECT

public:
    explicit CustomKeySequenceEdit(QWidget *parent = 0);
    ~CustomKeySequenceEdit();

protected:
    void keyPressEvent(QKeyEvent *pEvent);
};

#endif // CUSTOMKEYSEQUENCEEDIT_H

customkeysequenceedit.cpp

#include "customkeysequenceedit.h"

#include <QKeyEvent>

CustomKeySequenceEdit::CustomKeySequenceEdit(QWidget *parent) : QKeySequenceEdit(parent) { }

CustomKeySequenceEdit::~CustomKeySequenceEdit() { }

void CustomKeySequenceEdit::keyPressEvent(QKeyEvent *pEvent)
{
    QKeySequenceEdit::keyPressEvent(pEvent);

    QKeySequence seq(QKeySequence::fromString(keySequence().toString().split(", ").first()));
    setKeySequence(seq);

}

您可以使用QKeySequence[]運算符: http : QKeySequence

因此,在您的接口構造函數中,編寫以下代碼:

connect(ui->editShortcut, &QKeySequenceEdit::editingFinished, 
        this, &dialog::truncateShortcut);

並將此私有方法添加到對話框類中:

void dialog::truncateShortcut()
{
    int value = ui->editShortcut->keySequence()[0];
    QKeySequence shortcut(value);
    ui->editShortcut->setKeySequence(shortcut);
}

這樣做,你完全尊重API和不依賴於,性格,這是相當危險的。

我對此的看法:如果只需要單個快捷方式,我們為什么要在編輯模式下等待。 因此在成功時立即中斷編輯:

inline bool QKeySequence_valid( const QKeySequence& accelerator ){
    return !accelerator.isEmpty() && accelerator[0] != Qt::Key_unknown;
}

class Single_QKeySequenceEdit : public QKeySequenceEdit
{
protected:
    void keyPressEvent( QKeyEvent *e ) override {
        QKeySequenceEdit::keyPressEvent( e );
        if( QKeySequence_valid( keySequence() ) )
            editingFinished();
    }
};

真正的實現,因為我一直在努力尋找這樣的一種:

class Single_QKeySequenceEdit : public QKeySequenceEdit
{
protected:
    void keyPressEvent( QKeyEvent *e ) override {
        QKeySequenceEdit::keyPressEvent( e );
        if( QKeySequence_valid( keySequence() ) )
            clearFocus(); // trigger editingFinished(); via losing focus 🙉
                          // because this can still receive focus loss b4 getting deleted (practically because modal msgbox)
                          // and two editingFinished(); b no good
    }
    void focusOutEvent( QFocusEvent *event ) override {
        editingFinished();
    }
    bool event( QEvent *event ) override { // comsume ALL key presses including Tab
        if( event->type() == QEvent::KeyPress ){
            keyPressEvent( static_cast<QKeyEvent*>( event ) );
            return true;
        }
        return QKeySequenceEdit::event( event );
    }
};

void accelerator_edit( QTreeWidgetItem *item ){
        auto edit = new Single_QKeySequenceEdit;
        QObject::connect( edit, &QKeySequenceEdit::editingFinished, [item, edit](){
            const QKeySequence accelerator = edit->keySequence();
            item->treeWidget()->setItemWidget( item, 1, nullptr );
            if( QKeySequence_valid( accelerator ) )
                accelerator_alter( item, accelerator );
        } );
        item->treeWidget()->setItemWidget( item, 1, edit );
        edit->setFocus(); // track sanity gently via edit being focused property
}

暫無
暫無

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

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