允许用户输入组合键的最简单方法是什么?它基本上看起来像QLineEdit
字段,但它只接受组合键。
例如,Qt 设计器中已经有一些东西,您可以在其中为操作分配快捷方式。我的要求完全一样。TIA
Qt Creator 实际上是开源的。因此,如果您确切地想要该对话框的作用,您可以窥视并查看他们是如何做到的。
该“编辑操作”对话框的实现位于名为“QtTools”的库中。这是头文件和源文件:
...但它看起来有点间接,并且引导到表单引擎本身。您必须挖掘一段时间才能到达它实际捕获键序列的部分。休闲浏览无调试器建议它QtKeySequenceEdit
在这些文件中实现:
从 Qt 5.2 开始,您可以为此目的使用QKeySequenceEdit
我找到了一些替代方法来满足我的要求。我想要一个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) );
}
这个问题对找到解决方案非常有帮助。