【问题标题】:Limit QKeySequence/QKeySequenceEdit to only one shortcut将 QKeySequence/QKeySequenceEdit 限制为只有一个快捷方式
【发布时间】:2015-07-12 10:44:34
【问题描述】:

是否可以限制QKeySequenceQKeySequenceEdit 中只显示一个快捷方式?目前它支持多达 4 个快捷方式。我的应用程序仅支持一个快捷键的按键序列,例如Ctrl+ACtrl+C 而不是例如Ctrl+A, DCtrl+C, X, Z

是否可以将QKeySequenceQKeySequenceEdit 限制为一个按键序列?

【问题讨论】:

  • QKeySequence 支持四键有什么问题?您不必定义四个快捷键,是吗?只需将它们与两个键一起使用即可。
  • @FrankOsterfeld 不,我不是,但是向用户显示四个键并只使用一个键是一个 UX nogo...
  • 如果您不定义这些快捷方式,它们会在 UI 中的什么位置显示?
  • @FrankOsterfeld 他们出现在我正在使用的QKeySequenceEdit 中。不显示他们也可以...
  • 这似乎更像是一个关于QKeySequenceEdit 的问题,而不是QKeySequence

标签: c++ qt qt5 qkeyevent qkeysequence


【解决方案1】:

可以使用QKeySequence[]运算符:http://doc.qt.io/qt-5/qkeysequence.html#operator-5b-5d

所以在你的接口构造函数中,这样写:

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 并且不依赖 , 字符,这是非常冒险的。

【讨论】:

    【解决方案2】:

    解决了,不是最好的解决方案,但速度很快...如果您想要更多定制的东西,我认为您必须自己构建它...

    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);
    
    }
    

    【讨论】:

    • 非常感谢。我只是在“更改”事件上使用 toString().split(", ").first() 。我无法在设计器中添加自定义元素 :(
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2011-08-30
    • 2017-08-08
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多