Russian Qt Forum
Ноябрь 27, 2024, 21:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как установить курсор в QLineEdit в начало текста?  (Прочитано 10304 раз)
radislav72
Гость
« : Июнь 07, 2010, 07:51 »

Идея такая: если на QLineEdit установлена маска (inputMask), то при клике мышью на виджете с целью ввода текста курсор ставится в позицию клика, даже если текст еще не введен вообще и виджет "пустой". Так что пользователю, чтобы начать вводить значение, нужно сделать еще одно лишнее движение: жать Home перед вводом.

Как попроще обойти такое поведение? То есть, можно при FocusIn проверять наличие маски и принадлежность классу QLineEdit и поставить курсор в начало, если текст пустой.

Но как переместить курсор в QLineEdit?
Записан
Prm
Гость
« Ответ #1 : Июнь 07, 2010, 08:19 »

void setCursorPosition(int pos);
Записан
radislav72
Гость
« Ответ #2 : Июнь 07, 2010, 11:49 »

 Улыбающийся
Спасибо!

Я уже сильно усложнил все, старался сделать по аналогии с QTextEdit.
Записан
radislav72
Гость
« Ответ #3 : Июнь 07, 2010, 13:53 »

Правда, моя радость была преждевременна Улыбающийся

По нажатию отдельной кнопке все работает. Но в контексте нужного поведения QLineEdit- проблема. Делаю так:
Код:
bool mem_new_phpDialog::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QEvent::FocusIn)
    {
        if (o->metaObject()->className() == QLatin1String("QLineEdit"))
        {
            if (qobject_cast<QLineEdit*>(o)->inputMask() != "")
            {
                qobject_cast<QLineEdit*>(o)->setCursorPosition(0);
            }
        }
    }
    return QDialog::eventFilter(o, e);
}

Код выполняется, но при вызове обработчика по умолчанию он перекрывает нужное поведение и снова устанавливает курсор посредине QLineEdit-а. Если же сделать вместо вызова обработчика по умолчанию return true, поведение QLineEdit вообще странное: иногда курсор действительно переходит в начало, иногда (чаще) нет, а сам курсор вообще не мигает...

Как все ето можно обойти?
Записан
ритт
Гость
« Ответ #4 : Июнь 08, 2010, 07:43 »

> Если же сделать вместо вызова обработчика по умолчанию return true, поведение QLineEdit вообще странное...
переведу:
Если же вместо вызова обработчика херить все события, отправляемые некоему QLineEdit, поведение данного QLineEdit вообще странное...

читайте внимательно документацию по QEvent и eventFilter()
Записан
radislav72
Гость
« Ответ #5 : Июнь 08, 2010, 07:50 »

Поиски в Гугле вроде дают результат, свидетельствующий о какой-то проблеме при связке QLineEdit, FocusIn и setCursorPosition (например QLineEdit setCursorPosition & cursor blinking problems).

Ну я сделал по-другому: вместо FocusIn использовал MouseButtonPress, и вместо setCursorPosition просто выделяю весь текст LineEdit-а, если он пустой. При вводе не мешает.
Записан
radislav72
Гость
« Ответ #6 : Июнь 08, 2010, 07:58 »

Если же вместо вызова обработчика херить все события...
...читайте внимательно документацию по QEvent и eventFilter()

Спасибо за ответ. Но я не совсем понял намека: в документации QT для QObject::eventFilter написано:
Цитировать
In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.

То-есть, если я хочу остановить последующую обработку сообщения, возвращаю true. Я думал (и думаю), что курсор переустанавливает обработчик сообщения по умолчанию, потому хотел его "обойти" и вызывал true. Может, я не правильно понимаю, но в той же документации QT есть пример:
Код:
if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             return true;
         } else {
             return false;
         }

То есть действительно возвращают просто true. В чем заключается "похерение всех событий"?
Записан
Marat(Qt)
Гость
« Ответ #7 : Июнь 08, 2010, 19:44 »

Если же вместо вызова обработчика херить все события...
...читайте внимательно документацию по QEvent и eventFilter()

Спасибо за ответ. Но я не совсем понял намека: в документации QT для QObject::eventFilter написано:
Цитировать
In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.

То-есть, если я хочу остановить последующую обработку сообщения, возвращаю true. Я думал (и думаю), что курсор переустанавливает обработчик сообщения по умолчанию, потому хотел его "обойти" и вызывал true. Может, я не правильно понимаю, но в той же документации QT есть пример:
Код:
if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             return true;
         } else {
             return false;
         }

То есть действительно возвращают просто true. В чем заключается "похерение всех событий"?
Видимо имелось ввиду это:
Код:
bool mem_new_phpDialog::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QEvent::FocusIn)
    {
        if (o->metaObject()->className() == QLatin1String("QLineEdit"))
        {
            if (qobject_cast<QLineEdit*>(o)->inputMask() != "")
            {
                qobject_cast<QLineEdit*>(o)->setCursorPosition(0);
                return true;
            }
        }
    }
    return QDialog::eventFilter(o, e);// если поставить здесь return true - то все объекты для которых включен
                                                // eventfilter перестанут реагировать на события (кроме, конечно, lineedit'a с маской)
}
Кстати глубокого смысла строки "return QDialog::eventFilter(o, e);" я так и не уловил
Записан
radislav72
Гость
« Ответ #8 : Июнь 08, 2010, 21:52 »

Цитировать
Видимо имелось ввиду это...
Я как раз так и делал. И такой код не приводит к желаемому: т.е. курсор НЕ устанавливается в начало, если все ето делается в обработке события FocusIn. Если вызвать установку курсора, например, при нажатии какой-то кнопки, то все работает хорошо, а из eventFilter- нет. В том весь мой вопрос и заключался.

Если в приведенном Вами коде сработает строка return true; (та, что после setCursorPosition), то return QDialog::eventFilter(o, e); уже, соответственно, никогда не выполнится, потому я и писал, что вместо стандартного обработчика вызывал return true. Правда, допускаю, что я не совсем правильно выразился в етом месте.

Полностью заменять QDialog::eventFilter на return true я не собирался Улыбающийся

Фактом остается то, что приведенный мной (и повторенный Вами) код не устанавливает курсор в начало строки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 21.