0

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

virtual void focusInEvent(QFocusEvent *event) override;

到标题。我首先尝试像这样实现它:

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

但它不会选择文本,显然,在selectAll()调用某些内容时尚未处理。

可行的解决方案是将selectAll()调用放入QTimer::singleShotlambda 调用中,等待时间为 0 秒,如下所示:

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

这允许在selectAll()调用之前处理所有内容并且一切正常。

这只是一个例子,我已经多次遇到这个问题。所以我想知道是否有一个预定义的方法告诉Qt“执行以下,但之前处理其他所有内容”?

4

2 回答 2

1

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

在构造函数中,添加代码: connect(this, &MyLineEdit::focusIn, this, &QLineEdit::selectAll, Qt::QueuedConnection);

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

工作正常!

于 2018-08-13T07:03:50.980 回答
0

你可以这样做:

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

不过,这是否更好还有待商榷。它也仅适用于使用声明的插槽和其他可调用Q_INVOKABLE对象,而不适用于所有方法。

从风格上讲,我同意你的观点,如果有一个 API 会很好;该QTimer::singleShot()构造看起来有点奇怪(但工作正常)。

于 2018-08-13T07:11:45.247 回答