Я только что реализовал QLineEdit
, который выбирает текст сразу после получения фокуса. Я создал производный класс и добавил
virtual void focusInEvent(QFocusEvent *event) override;
к заголовку. Сначала я попытался реализовать это так:
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
QLineEdit::focusInEvent(event);
selectAll();
}
но он не выбрал бы текст, так как, по-видимому, некоторые вещи еще не были обработаны во время вызова selectAll()
.
Рабочее решение состоит в том, чтобы поместить вызов selectAll()
в лямбда-вызов QTimer::singleShot
с 0 секундами ожидания следующим образом:
void MyLineEdit::focusInEvent(QFocusEvent *event)
{
QLineEdit::focusInEvent(event);
QTimer::singleShot(0, [this]() { selectAll(); } );
}
Это позволяет обработать все до вызова selectAll()
, и все работает нормально.
Это только один пример, я уже несколько раз сталкивался с этой проблемой. Поэтому мне интересно, есть ли предопределенный метод, сообщающий Qt: «Выполните следующее, но обработайте все остальное раньше»?
QTimer::singleShot(0, this, &QLineEdit::selectAll);
- person eyllanesc   schedule 12.08.2018