首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QShortCut和QSpinBox冲突

QShortCut和QSpinBox冲突
EN

Stack Overflow用户
提问于 2011-04-13 02:18:49
回答 3查看 1.4K关注 0票数 5

如果我使用自己的快捷方式,我正在编写一个应用程序。它看起来是这样的:

代码语言:javascript
复制
myShortcut= new QShortcut(Qt::SHIFT + Qt::Key_B,this);
connect(myShortcut, SIGNAL(activated()), this, SLOT(setCameraBack()));

我在主窗口小部件的构造函数中定义了它,它工作得很好,直到我单击了主窗口小部件上的一个旋转框按钮。在那之后,我的快捷键停止工作,直到我点击按钮或复选框,它才能工作。当我这样做的时候,一切都会好起来的。我想补充的是,在我点击spinbox之后,它似乎是“活动的”(因为光标仍然在它上面“闪烁”),直到我点击其他按钮之一。你知道哪里出了问题吗?是某种流程或事件问题吗?谢谢你所有的回答~马洛克

EN

回答 3

Stack Overflow用户

发布于 2011-04-13 02:22:01

当快捷方式的父小部件正在接收事件时,Qt的事件循环将“侦听”该快捷方式。

当QSpinBox具有keyboard focus时,则QShortcut对象的父对象不再接收事件。因此,在从QSpinBox中删除keyboard focus之前,该快捷方式不起作用。您可以通过将Qt::WidgetWithChildrenShortcut or Qt::ApplicationShortcut传递给QShortcut的QShortcut::setContext方法来更改此行为。

票数 4
EN

Stack Overflow用户

发布于 2016-05-11 02:36:18

在激活快捷方式之前,将为focus小部件提供一个ShortcutOverride事件。如果接受该事件,则会将按键事件传递给小工具,并且不会激活快捷方式。

来源:https://wiki.qt.io/ShortcutOverride

查看Qt源代码

代码语言:javascript
复制
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

代码语言:javascript
复制
    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;
                }
            }
        }
    }

如果未同时按下code键,则此代码接受大多数键。

因此,最简单的解决方案是更改快捷键以包含控件修饰符。

或者,您可以子类化数字显示框并覆盖事件函数

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2011-04-13 02:44:57

你试过MySpinBox -> setFocusPolicy (Qt::NoFocus)吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5639790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档