【问题标题】:QAction Qt::Key_Return shortcut is triggered by user entering values in GUIQAction Qt::Key_Return 快捷方式由用户在 GUI 中输入值触发
【发布时间】:2012-08-13 12:12:29
【问题描述】:

我在将按键关联到 QAction 时遇到问题。我将 Enter 映射到这样的操作:

myAction->setShortcut(Qt::Key_Return);

问题是当我在QSpinBox 中键入一个值然后按Enter 时也会触发QAction。我原以为旋转框会使用该事件(因此它不会被主窗口捕获),但它不是那样工作的。

我发现我可以在快捷方式中添加上下文,我尝试了所有值,但这并不能解决我的问题。

@Matthew 确实是在拒绝事件:

case Qt::Key_Enter:
case Qt::Key_Return:
    d->edit->d_func()->control->clearUndo();
    d->interpret(d->keyboardTracking ? AlwaysEmit : EmitIfChanged);
    selectAll();
    event->ignore();
    emit editingFinished();
    return;

我觉得这种行为很奇怪。

【问题讨论】:

    标签: qt user-interface keyboard-shortcuts


    【解决方案1】:

    据我所知,QSpinBox 默认行为会等到您按 return 来接受该值。从技术上讲,一旦您更改它,该值就会被设置/接受。

    如果您希望更改该行为,即当您在QSpinBox 上点击 return 时,您的值实际上已设置/接受,那么您很可能必须处理关联的键在QSpinBox 上按自己的事件并将其标记为已接受(即event->accepted())。

    否则,这听起来像最初设计的那样工作,尽管不是你想要的。

    【讨论】:

    • 我的问题不在于 QSPinBox 接受该值。问题是进入事件没有被QSpinBox“吃掉”。因此,相同的击键触发了来自 QSpinBox 的接受值(好的),但它也触发了我的 QAction! (不好)
    • @JulienM 没错,QSpinBox 的默认行为不会消耗该事件。因此,您必须实现自己的从 QSpinBox 派生的自定义类才能使用该事件。
    • 但这意味着我还需要对我可能添加到主窗口中并且不消耗输入事件的所有 QWidget 进行子类化!
    【解决方案2】:

    我也有同样的问题,只是在 PyQt 和 QLineEdit 中

    可能 QAction 始终被视为菜单操作或全局操作,并且具有比 Widget 默认键更高的优先级。

    我的“解决方案”是使用重要键(Return、Tab、Backspace 等)作为快捷键创建我的操作的全局列表。

    然后我连接到 QLineEdit focusInEvent 和 focusOutEvent。每次事件发生时,我都会遍历动作列表并在 focusIn 上将它们全部停用并在 focusOut 上再次激活它们。然后我将事件交给原始的焦点事件处理程序。

    我真的希望有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多