【问题标题】:QLineEdit emits returnPressed when getting focus triggered by other returnPressed singal当获得由其他 returnPressed 信号触发的焦点时,QLineEdit 发出 returnPressed
【发布时间】:2020-10-09 10:32:12
【问题描述】:

我有 2 个 QlineEdit 和一个 QPushbutton

QLineEdit *field1 = new QlineEdit();
QLineEdit *field2 = new QLineEdit();
QPushButton *button = new QPushButton();

我想要什么:

  • 如果用户在字段 1 中按下返回,焦点应更改为字段 2。
  • 如果用户在字段 2 中按下返回,则应单击该按钮。

为此我有:

/* A */ connect(field1, &QLineEdit::returnPressed, field2, QOverload<>::of(&QLineEdit::setFocus));
/* B */ connect(field2, &QLineEdit::returnPressed, button, &QPushButton::click);
/* C */ connect(submit, &QPushButton::clicked, this, &SomeClass::SomeFunction);

现在发生的是:

  1. 如果我在 field1 中按回车键,焦点会转到 field2,但按钮会发出 clicked()。
  2. 如果我在 field2 中按回车,按钮会发出两次 clicked()。

对于第 1 点,我可以假设在将焦点设置为 field2 后,按下返回键事件仍然处于活动状态。有没有办法避免这种情况?但如果是这种情况,为什么按钮只发出一次 clicked() 而不是像下一步那样发出两次?

如果我将连接 B 替换为,则可以解决第 2 点

/* B */ connect(field2, &QLineEdit::returnPressed, button, &QPushButton::toggle);

然后 clicked() 只发出一次。但这对我来说并不清楚。 toggle() should only work for checkable buttons,但 button is not checkable。并且 clicked() 应该not be emitted if toggle() is called

我是否误解了这些概念?

我使用的是 Qt 5.12.9

更新

在编写过程中,我进行了一些测试,并将父对象从 QDialog 更改为 QWidget,这解决了我的问题。所以我假设在 QDialog 上点击返回会以某种方式点击按钮。也许任何人都可以向我解释。提前致谢。

【问题讨论】:

    标签: qt qpushbutton qlineedit qdialog


    【解决方案1】:

    QDialog 有一个默认按钮,在按下 Return 时触发。
    这就是为什么在这两种情况下你总是有一个额外的clicked()

    QDialog default button

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多