知道按下的键是否只是一个修饰符
Qt - know whether a pressed key is just a modifier
我希望孩子对QKeyEvent
的处理不是当它只是一个被按下的修饰符键时执行。下面的代码可以完成这项工作,但是像这样列出它们是不方便的。有没有一种内置的方法来做到这一点?
void TextEditor::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Shift:
case Qt::Key_Control:
case Qt::Key_Alt:
case Qt::Key_Meta:
case Qt::Key_Mode_switch:
return QPlainTextEdit::keyPressEvent(event);
}
// handle the event...
}
您可以为此目的使用QKeyEvent::modifiers()成员。如果结果是
const bool isModifier = ( event->modifiers() != Qt::NoModifier );
为true则按下的键是修饰符
对于你的代码,它意味着以下修改:
void TextEditor::keyPressEvent( QKeyEvent* event )
{
if ( event->modifiers() != Qt::NoModifier )
{
return QPlainTextEdit::keyPressEvent(event);
}
// Handle the event ...
}
或者如果你想处理一些特殊的组合键,为什么不直接使用这种方式:
void TextEditor::keyPressEvent( QKeyEvent* aKeyEvent )
{
if ( aKeyEvent->matches( QKeySequence::Copy ) )
{
// Your copy stuff ...
return;
}
// else if ( aKeyEvent->matches( ... ) ) // Other key combinations ...
return QPlainTextEdit::keyPressEvent( aKeyEvent);
}
用3行更好的方法:
if(event->modifiers()){
event->ignore(); // or don't ignore and handle the event
// switching the modifiers
}
这是由qt定义的修饰符:
Qt::NoModifier
Qt::ShiftModifier
Qt::ControlModifier
Qt::AltModifier
Qt::MetaModifier
Qt::KeypadModifier
Qt::GroupSwitchModifier
你可以做一个过滤开关
相关文章:
- 此代码是否违反一个定义规则
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 是否可以同时声明一个类成员的常量/非常量?
- C++-字符串是否包含一个带有简单循环的单词
- 检查注册表项是否链接到(或副本)另一个注册表项
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 一元*运算符的操作数是否期望一个 prvalue
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 是否可以创建一个从不同类调用函数的线程?
- 这些场景中的任何一个是否会造成内存泄漏
- 在一个结构中,使用一个数组字段访问另一个是否合法
- C++检查前 5 个或接下来的 5 个元素中的任何一个是否等于值