【发布时间】:2012-11-21 06:05:49
【问题描述】:
允许用户输入组合键的最简单方法是什么?
它基本上看起来像QLineEdit 字段,但它只接受组合键。
例如,Qt 设计器中已经有一些东西,您可以在其中为操作分配快捷方式。我的要求完全一样。 TIA
【问题讨论】:
允许用户输入组合键的最简单方法是什么?
它基本上看起来像QLineEdit 字段,但它只接受组合键。
例如,Qt 设计器中已经有一些东西,您可以在其中为操作分配快捷方式。我的要求完全一样。 TIA
【问题讨论】:
从 Qt 5.2 开始,您可以为此目的使用 QKeySequenceEdit
【讨论】:
Qt Creator 实际上是开源的。所以如果你想知道那个对话框到底是做什么的,你可以窥视一下,看看他们是怎么做的。
“Edit Action” 对话框的实现位于名为“QtTools”的库中。这是头文件和源文件:
...但它看起来有点间接,并且引导到表单引擎本身。您必须挖掘一段时间才能到达它实际捕获键序列的部分。无调试器的休闲浏览表明它是在这些文件中实现的QtKeySequenceEdit:
【讨论】:
我找到了一些替代方法来实现我的要求。我想要一个类似QLineEdit 的输入字段,它将捕获符合以下格式的组合键:
最简单的方法是通过子类化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 对找到解决方案很有帮助。
【讨论】: