问题描述
我有2个QlineEdit和一个QPushbutton
QLineEdit *field1 = new QlineEdit();
QLineEdit *field2 = new QLineEdit();
QPushButton *button = new QPushButton();
我想要什么:
- 如果用户在field1中按下return键,则焦点应更改为field2。
- 如果用户在field2中按下return键,则应单击该按钮。
为此,我有:
/* A */ connect(field1,&QLineEdit::returnPressed,field2,QOverload<>::of(&QLineEdit::setFocus));
/* B */ connect(field2,button,&QPushButton::click);
/* C */ connect(submit,&QPushButton::clicked,this,&SomeClass::SomeFunction);
现在发生的是:
- 如果我在field1中按回车键,则焦点将移至field2,但按钮将发出clicked()。
- 如果我在field2中按Return键,则按钮将发出两次clicked()。
对于点1,我可以假定将焦点设置为field2后,按下回车键事件仍然处于活动状态。有办法避免这种情况吗?但是如果是这种情况,为什么按钮只发出一次clicked()而不发出两次,就像下一步一样?
如果我将连接B替换为
,则可以解决第2点问题/* B */ connect(field2,&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上单击return会单击按钮。也许任何人都可以向我解释。预先感谢。
解决方法
QDialog
具有一个默认按钮,该按钮在按下Return键时触发。
这就是为什么在两种情况下总是要多加一个clicked()
的原因。