微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QShortCut和QSpinBox冲突

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?