在输入字段中关注超时后是否有任何方法发送信号

Is there any way to send signal after focus on timeout in input field

我遇到了类似的情况,当我在任何输入字段上使用 'autofocus' 然后通过以下信号我可以调出键盘:

connect(view, SIGNAL(loadFinished(bool)), SLOT(popupKeyboardOnAutoFocus(bool)));

其中 popupKeyboardOnAutoFocus 是调出键盘的函数。

现在,我正在尝试在 30 秒超时后将焦点提供给输入字段时调出键盘,即,我有一个按钮,单击后系统等待 30 秒然后提供焦点到输入字段。

参考:

<html>
<body>

<p>Click the button to wait 3 seconds, then alert "Hello".</p>

<input type="text" id="myText" value="A text field">
<br><br><br>
<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
    setTimeout(function(){ 
    document.getElementById("myText").focus();
    }, 3000);
}
</script>

</body>
</html>

现在,当我尝试使用如下信号时:

 connect(view, SIGNAL(focus(bool)),SLOT(popupKeyboardOnAutoFocus(bool)));

我无法调出键盘,但 30 秒后我可以看到焦点在输入字段上。 我哪里错了?

您需要稍微修改一下您的逻辑并使用这个全局信号:

void QApplication::focusChanged(QWidget *old, QWidget *new)

其中 old 是失去焦点的小部件,new 是刚刚获得焦点的小部件。

因此,例如,您需要通过修改其签名来允许您的 popupKeyboardOnAutoFocus 遵守该信号参数,例如: popupKeyboardOnAutoFocus(QWidget*, QWidget*, bool)

然后你可以使用新的信号槽语法如下:

connect(app, &QApplication::focusChanged , this, &Myclass::popupKeyboardOnAutoFocus);

或者,如果您想保持简单,请使用 singleshot QTimer[=36= 将您的 loadfinished() 连接到一个新的本地插槽] 30 秒,然后调用 popupKeyboardOnAutoFocus: 类似于:

connect(view, SIGNAL(loadFinished(bool)), SLOT(delayElmnt()));

而 delayElmnt() 可以是这样的:

{
QTimer::singleShot(30000, this, SLOT(popupKeyboardOnAutoFocus()));
}