代码之家  ›  专栏  ›  技术社区  ›  Tobias Leupold

是否有QTimer::singleshot(0)lambda函数调用的替代解决方案

  •  0
  • Tobias Leupold  · 技术社区  · 6 年前

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

    virtual void focusInEvent(QFocusEvent *event) override;
    

    void MyLineEdit::focusInEvent(QFocusEvent *event)
    {
        QLineEdit::focusInEvent(event);
        selectAll();
    }
    

    但它不会选择文本,因为显然,有些东西当时还没有处理 selectAll() 被称为。

    有效的解决方案是 全选() QTimer::singleShot lambda呼叫,等待0秒,如下所示:

    void MyLineEdit::focusInEvent(QFocusEvent *event)
    {
        QLineEdit::focusInEvent(event);
        QTimer::singleShot(0, [this]() { selectAll(); } );
    }
    

    这让一切都可以在 全选() 被调用,一切正常。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Peter Ha    6 年前

    你可以这样做:

    QMetaObject::invokeMethod(this, "selectAll", Qt::QueuedConnection);
    

    不过,这是否更好还有待商榷;而且它只适用于用 Q_INVOKABLE

    从风格上来说,我同意你的观点,有一个API来实现这一点是很好的 QTimer::singleShot() 构造看起来有点奇怪(但工作正常)。

        2
  •  1
  •   Saber    6 年前

    在类定义中,添加代码: signals: void focusIn();

    connect(this, &MyLineEdit::focusIn, this, &QLineEdit::selectAll, Qt::QueuedConnection);

    在focusInEvent函数中,添加代码: emit this->focusIn();

    好好工作!