如何解决QShortCut和QSpinBox冲突
| 我正在使用自己的快捷方式编写应用程序。看起来像这样:myShortcut= new QShortcut(Qt::SHIFT + Qt::Key_B,this);
connect(myShortcut,SIGNAL(activated()),this,SLOT(setCameraBack()));
我在主窗口小部件的构造函数中定义了它,并且在我单击也位于主窗口小部件上的旋转框按钮之一之前,它可以正常工作。在那之后,我的快捷方式停止工作,直到我单击按钮或复选框,它才起作用。当我这样做时,一切都很好。我想补充一点,在我单击旋转框之后,它似乎是“活动的”(因为光标仍然在其上“闪烁”),直到我单击其他按钮之一为止。你有什么想法吗是某种过程或事件问题吗?感谢所有答案
〜马尔罗克
解决方法
快捷方式是Qt的“监听”
快捷方式的父级时发生事件循环
小部件正在接收事件。
当QSpinBox具有键盘焦点时,QShortcut对象的父对象不再接收事件。因此,快捷方式在从QSpinBox移除键盘焦点之前不起作用。您可以通过将Qt :: WidgetWithChildrenShortcut或Qt :: ApplicationShortcut传递给QShortcut的QShortcut :: setContext方法来更改此行为。
,在激活快捷方式之前,将为焦点小部件提供ShortcutOverride事件。如果事件被接受,则键事件将传递到窗口小部件,并且快捷方式未激活。
资料来源:https://wiki.qt.io/ShortcutOverride
看Qt源
QAbstractSpinBox::event(QEvent *event)
{
Q_D(QAbstractSpinBox);
switch (event->type()) {
...
case QEvent::ShortcutOverride:
if (d->edit->event(event))
return true;
break;
...
}
return QWidget::event(event);
}
QAbstractSpinBox允许内部编辑接受事件。 QLineEdit遵循QLineControl。来自qt / src / gui / widgets / qlinecontrol.cpp
case QEvent::ShortcutOverride:{
if (isReadOnly())
return false;
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
if (ke == QKeySequence::Copy
|| ke == QKeySequence::Paste
|| ke == QKeySequence::Cut
|| ke == QKeySequence::Redo
|| ke == QKeySequence::Undo
|| ke == QKeySequence::MoveToNextWord
|| ke == QKeySequence::MoveToPreviousWord
|| ke == QKeySequence::MoveToStartOfDocument
|| ke == QKeySequence::MoveToEndOfDocument
|| ke == QKeySequence::SelectNextWord
|| ke == QKeySequence::SelectPreviousWord
|| ke == QKeySequence::SelectStartOfLine
|| ke == QKeySequence::SelectEndOfLine
|| ke == QKeySequence::SelectStartOfBlock
|| ke == QKeySequence::SelectEndOfBlock
|| ke == QKeySequence::SelectStartOfDocument
|| ke == QKeySequence::SelectAll
|| ke == QKeySequence::SelectEndOfDocument) {
ke->accept();
} else if (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier
|| ke->modifiers() == Qt::KeypadModifier) {
if (ke->key() < Qt::Key_Escape) {
ke->accept();
} else {
switch (ke->key()) {
case Qt::Key_Delete:
case Qt::Key_Home:
case Qt::Key_End:
case Qt::Key_Backspace:
case Qt::Key_Left:
case Qt::Key_Right:
ke->accept();
default:
break;
}
}
}
}
如果未同时按下控制键,则此代码接受大多数键。
因此,最简单的解决方案是更改快捷方式以包含控件修饰符。
或者,您可以子类化旋转框并覆盖事件函数
bool MySpinBox::event(QEvent *event)
{
if( event->type() == QEvent::ShortcutOverride && !isReadOnly() )
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
// Ignore \'B\' shortcuts
if( keyEvent->key() == Qt::Key_B )
{
Q_ASSERT( !event->isAccepted() );
return true;
}
return QSpinBox::event(event);
}
,你试过MySpinBox -> setFocusPolicy (Qt::NoFocus)
吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。