【问题标题】:How to create a hotkey field in Qt如何在 Qt 中创建热键字段
【发布时间】:2012-11-21 06:05:49
【问题描述】:

允许用户输入组合键的最简单方法是什么? 它基本上看起来像QLineEdit 字段,但它只接受组合键。

例如,Qt 设计器中已经有一些东西,您可以在其中为操作分配快捷方式。我的要求完全一样。 TIA

【问题讨论】:

    标签: qt qt4 qlineedit


    【解决方案1】:

    从 Qt 5.2 开始,您可以为此目的使用 QKeySequenceEdit

    【讨论】:

    【解决方案2】:

    Qt Creator 实际上是开源的。所以如果你想知道那个对话框到底是做什么的,你可以窥视一下,看看他们是怎么做的。

    “Edit Action” 对话框的实现位于名为“QtTools”的库中。这是头文件和源文件:

    actioneditor_p.h

    actioneditor.cpp

    ...但它看起来有点间接,并且引导到表单引擎本身。您必须挖掘一段时间才能到达它实际捕获键序列的部分。无调试器的休闲浏览表明它是在这些文件中实现的QtKeySequenceEdit

    qtpropertybrowserutils_p.h

    qtpropertybrowserutils.cpp

    【讨论】:

    • 我实现了我想要的,作为答案添加。再次感谢您的正确指导。
    【解决方案3】:

    我找到了一些替代方法来实现我的要求。我想要一个类似QLineEdit 的输入字段,它将捕获符合以下格式的组合键:

    • Alt+Ctrl+Shift+X
    • Alt+Ctrl+X
    • Alt+Shift+X
    • Ctrl+Shift+X

    最简单的方法是通过子类化QLineEdit& 重新实现keyPressEvent( QKeyEvent * event ) 函数。我的头文件和 cpp 文件看起来像这样。任何人都可以操作keyPressEvent 内部的逻辑以满足他们的需求。

    QLineEditHotKey.h

    #include <QLineEdit>
    
    class QLineEditHotKey: public QLineEdit
    {
    public:
        QLineEditHotKey( QWidget* pParent = NULL);
        ~QLineEditHotKey(){}
    protected:
        void keyPressEvent ( QKeyEvent * event );
    };
    

    QLineEditHotKey.cpp

    QLineEditHotKey::QLineEditHotKey(QWidget* pParent):QLineEdit(pParent)
    {
    }
    
    void QLineEditHotKey::keyPressEvent( QKeyEvent * event )
    {
        int keyInt = event->key(); 
        Qt::Key key = static_cast<Qt::Key>(keyInt); 
    
        // Handle unknown keys
        if( key == Qt::Key_unknown ) 
            return; 
    
        // Pressing Esc or Backspace will clear the content
        if( key == Qt::Key_Escape || key == Qt::Key_Backspace )
        {  
            setText(NULL);
            return;
        } 
    
        // Empty means a special key like F5, Delete, Home etc
        if( event->text().isEmpty() )
            return;
    
        // Checking for key combinations
        Qt::KeyboardModifiers modifiers = event->modifiers(); 
    
        if(modifiers.testFlag(Qt::NoModifier)) 
            return;
        if(modifiers.testFlag(Qt::ShiftModifier)) 
            keyInt += Qt::SHIFT; 
        if(modifiers.testFlag(Qt::ControlModifier)) 
            keyInt += Qt::CTRL; 
        if(modifiers.testFlag(Qt::AltModifier)) 
            keyInt += Qt::ALT; 
    
        setText( QKeySequence(keyInt).toString(QKeySequence::NativeText) );
    }
    

    This question 对找到解决方案很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多