如何在Qt中创建热键字段

时间:2012-11-21 06:05:50

标签: qt qt4 qlineedit

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

例如,Qt Designer中已有一些内容可用于为Action分配快捷方式。我的要求完全一样。 TIA

Edit Action - assigning a shortcut

3 个答案:

答案 0 :(得分:2)

Qt Creator实际上是开源的。因此,如果您想要该对话框的功能,您可以查看它们是如何做到的。

“编辑操作”对话框的实现位于名为“QtTools”的库中。这是标题和源文件:

actioneditor_p.h

actioneditor.cpp

...但它看起来有点间接,并自行引导到表单引擎本身。您需要花一些时间才能到达实际捕获按键序列的部分。休闲浏览sans调试器建议在这些文件中实现QtKeySequenceEdit

qtpropertybrowserutils_p.h

qtpropertybrowserutils.cpp

答案 1 :(得分:1)

从Qt 5.2开始,您可以将QKeySequenceEdit用于此目的

答案 2 :(得分:0)

我找到了一些方法来实现我的要求。我想要一个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 问题对于找到解决方案非常有帮助。