对于QTimer::singleshot(0)lambda函数调用是否有其他解决方案

对于QTimer::singleshot(0)lambda函数调用是否有其他解决方案,qt,lambda,qtimer,qeventloop,Qt,Lambda,Qtimer,Qeventloop,我刚刚实现了一个QLineEdit,它在获得焦点后立即选择文本。我创建了一个派生类并添加了 virtual void focusInEvent(QFocusEvent *event) override; 到页眉。我首先尝试这样实现它: void MyLineEdit::focusInEvent(QFocusEvent *event) { QLineEdit::focusInEvent(event); selectAll(); } void MyLineEdit::focusI

我刚刚实现了一个QLineEdit,它在获得焦点后立即选择文本。我创建了一个派生类并添加了

virtual void focusInEvent(QFocusEvent *event) override;
到页眉。我首先尝试这样实现它:

void MyLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    selectAll();
}
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    QTimer::singleShot(0, [this]() { selectAll(); } );
}
但它不会选择文本,因为很明显,在调用selectAll时,某些内容还没有被处理

工作解决方案是将selectAll调用放入QTimer::singleShot lambda调用中,等待时间为0秒,如下所示:

void MyLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    selectAll();
}
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
    QLineEdit::focusInEvent(event);
    QTimer::singleShot(0, [this]() { selectAll(); } );
}
这允许在调用selectAll之前处理所有内容,并且一切正常


这只是一个例子,我已经多次遇到这个问题。因此,我想知道是否有一种预定义的方法告诉Qt执行以下操作,但要先处理所有其他操作?

在类define中,添加代码: 信号: 空洞病灶;

在构造函数中,添加以下代码: 连接此,&MyLineEdit::focusIn,此,&QLineEdit::selectAll,Qt::QueuedConnection;

在focusInEvent函数中,添加以下代码: 发射此->聚焦;

干得好

您可以这样做:

QMetaObject::invokeMethod(this, "selectAll", Qt::QueuedConnection);
不过,这是否更好还存在争议;此外,它仅适用于使用Q_INVOKABLE声明的插槽和其他可调用项,而不适用于所有方法


在风格上,我同意你的看法,如果有一个API就好了;QTimer::singleShot构造看起来有点奇怪,但工作正常。

我知道这是唯一的方法,但我可以使用更可读的方法:QTimer::singleShot0,this,&QLineEdit::selectAll;实际上我们这里不需要lambda,谢谢你的提示:-我想你需要它,但你不想要它;我不想要QTimer…你为什么不想要它?你有什么问题吗?谢谢你提供的信息!这只是关于这是否是一种可能或是一条道路。但显然,Qt目前还没有提供另一种方法。好吧,毕竟,它与QTimer::singleShot方法一起工作。谢谢您提供的信息!但问题不是关于焦点选择问题的具体案例,而是关于处理此类案例的一般方法。