【发布时间】:2019-01-19 07:11:12
【问题描述】:
我刚刚实现了一个QLineEdit,它在获得焦点后立即选择它的文本。我创建了一个派生类并添加了
virtual void focusInEvent(QFocusEvent *event) override;
到标题。我首先尝试像这样实现它:
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
QLineEdit::focusInEvent(event);
selectAll();
}
但它不会选择文本,显然,在调用 selectAll() 时某些内容尚未处理。
可行的解决方案是将selectAll() 调用放入QTimer::singleShot lambda 调用中,等待0 秒,如下所示:
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
QLineEdit::focusInEvent(event);
QTimer::singleShot(0, [this]() { selectAll(); } );
}
这样可以在调用selectAll() 之前处理所有内容,并且一切正常。
这只是一个例子,我已经多次遇到这个问题。所以我想知道是否有一个预定义的方法告诉Qt“执行以下,但之前处理其他所有内容”?
【问题讨论】:
-
我知道这是唯一的方法,但我可以使用更易读的方法:
QTimer::singleShot(0, this, &QLineEdit::selectAll); -
我们这里实际上不需要 lambda,谢谢提示 :-)
-
我认为你需要它,但你不想要它。 ;)
-
我不想要 QTimer ...
-
你为什么不想要它?你有什么问题吗?
标签: qt lambda qtimer qeventloop