![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
flankerr |
![]() ![]()
Сообщение
#1
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Есть диалог, на нём есть QTextEdit
Содержимое QTextEdit иниализированнол неким текстом ну к примеру "введите текст" Нужно что при попытке ввода текста умолчательное значение сразу стиралось. Частично сделать это получилось. Ловим событие OnSelectChanged() и елси оно сработал впервые то затираем текст setText(""); Но вот если перейти в QTextEdit через табуляцию (без мышки) получается кукишь. Вопрос как бы реализовать эту фишку? У мяен диалог сделан через дизайнер поэтому просьба предлогать варианты без созадние собственного класса наследника от QTextEdit. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ловим событие OnSelectChanged() незнаю что за событие такое.Вариантов два 1) нарисовать на QTextEdit нужный текст (смотри про QLineEdit подобную тему) 2) Отслеживать сигнал textChanged 3) Отслеживать событие focusInEvent |
|
|
flankerr |
![]()
Сообщение
#3
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
по спешке вместо сигнала void selectionChanged () написал название своего обработчика этого сигнала. Цитата 2) Отслеживать сигнал textChanged Беда в том что сигнал приходит ПОСЛЕ того как изменился текст Цитата 3) Отслеживать событие focusInEvent Для этого надо делать своего наследника от QTextEdit что в моём случае не возможно. (диалог создан в редакторе и переделовать его руками нет не времени ни желания) Однако елсиьбы была возможность отлсеживание смены фокуса дочерних элементов диалога то это всё бы решило. Но как отловить смену фокуса у дочерних эелементов диалога ??? Сообщение отредактировал flankerr - 4.3.2010, 16:43 |
|
|
MoPDoBoPoT |
![]()
Сообщение
#4
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Для этого надо делать своего наследника от QTextEdit что в моём случае не возможно. Для этого есть фильтр событий: QObject::eventFilter()+QObject::installEventFilter(). Надо будет обрабатывать QEvent::FocusIn и QEvent::FocusOut (и сделать небольшую проверку, чтобы не затирать пользовательский текст). Кстати, в дизайнере для наследования есть "продвижение своего виджета" (Promote to...) А вообще, 1-ый вариант, предложенный Litkevich Yuriy, самый красивый. |
|
|
flankerr |
![]()
Сообщение
#5
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
MoPDoBoPoT, Говрю же НЕ хочу делать наследника! Точнее нет такой возможности. Или предлогается фильровать события самого диалога? тогда как? можно подробнее?
Встраивать свой виджет на постоянной основе в список доступных виджетов у меня желания нет. У встроенного в Студию редактора найти "Promote to" не удалось. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
flankerr |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Сходил, почитал... но слона не вижу...
Там везде речь про класс наследник class authEdit : public QLineEdit |
|
|
MoPDoBoPoT |
![]()
Сообщение
#8
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
Сходил, почитал... но слона не вижу... Первый же ответ на вопрос (пост ViGOur'а). MoPDoBoPoT, Говрю же НЕ хочу делать наследника! Ну так связка QObject::eventFilter()+QObject::installEventFilter() не требует наследника (почитай ассистента, да и на форумах много про это писалось) |
|
|
flankerr |
![]()
Сообщение
#9
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
MoPDoBoPoT, слона точно не увидел... но дёргать у диалога paintEvent(QPaintEvent *) это очень не краисвый вариант для этой цели. Не. Не покатит.
На счёт фильтров на солкьо я понял надо у диалога переопределить eventFilter(QObject *obj, QEvent *event) так чтоли ? И дёргать на каждый чих.. эээ... Хрен редьки не слаще. Но похоже другого варианта нет. Попробую через это. Плин ну чего проще просто узнать что изменился фокус ввода - а не могу найти такогог сообшения... Сообщение отредактировал flankerr - 4.3.2010, 18:10 |
|
|
kwisp |
![]()
Сообщение
#10
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
ну не хочешь красиво напиши костыль. Цитата void QTextEdit::textChanged () [signal] This signal is emitted whenever the document's content changes; for example, when text is inserted or deleted, or when formatting is applied.
Сообщение отредактировал kwisp - 4.3.2010, 18:18 |
|
|
flankerr |
![]()
Сообщение
#11
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
MoPDoBoPoT У диалога eventFilter(QObject *obj, QEvent *event) почемуто вообще ни когда не вызывается.
kwisp, Красиво??? Простите а что из выше описанного красиво??? Ну уже же написал чуть выше сигнал textChanged () приходит ПОСЛЕ того как изменился текст. Это во первых. А во вторых не понял когда предполгаеся вызывать приведённую в качестве примера функцию и какому классу она должна принадлежать. |
|
|
kwisp |
![]()
Сообщение
#12
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
не функция а слот. присоедини к сигналу изменения текста в QTextEdit. пусть принадлежит классу, какому тебе заблагорассудится, где ты собрался обрабатывать события изменения фокуса? там и слот создай. вызывай этот слот при создании диалога 1 раз дале он будет вызываться всякий раз как ты изменишь текст и в случае пустого текста в редактореТекста появится Введите текст! + будет выделенным. это предложенный мной вариант как альтернативный предложенным ранее. если тебе лень или нет времени изучить что такое фильтр событий eventFilter() можешь воспользоваться этим методом по моему с твоей задачей он справляется. П.С. если ты не понял -- фильтр событий не тронет твой диалог, тебе не надо будет наследоваться и переписывать методы диалога. Сообщение отредактировал kwisp - 4.3.2010, 18:37 |
|
|
MoPDoBoPoT |
![]()
Сообщение
#13
|
Участник ![]() ![]() Группа: Участник Сообщений: 172 Регистрация: 7.5.2009 Из: Москва Пользователь №: 738 Спасибо сказали: 44 раз(а) Репутация: ![]() ![]() ![]() |
А ты установил фильтр на текстедит? Пример:
|
|
|
flankerr |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, ну если я правильно понял то фишка в textEdit.selectAll(). При попытки изменения, изменение встанет на место выделения, а т.к. выделено всё то оно соответсвенно будет удалено и замениться на только что введённое. Если я правильно понял тогда нет смысла в этом слоте и привязки к изменению текста. Можно просто в момент иницализации диалога инициализировать и текст и выделить его - так оно логичнее будет.
Но выделять текст не хотелось бы. MoPDoBoPoT, О! видимо это я не учёл. Спасибо. Заработало. И так благодаря вашим советам найдено два спосба решения поставленой задачи: 1.
2.
Сообщение отредактировал flankerr - 4.3.2010, 19:15 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, логика твоего примера имеет ошибку, т.к. когда пользователь начнёт писать, то оно не пусто, а надобы убрать "Введите Текст".
Нет, всё таки первый вариант был самый простой, с рисованием поверх. О! видимо это я не учёл как так не учёл, вот ведь пример в описании функции изучи его внимательно.
|
|
|
kwisp |
![]()
Сообщение
#16
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
правильно понял. тогда нет смысла в этом слоте и привязки к изменению текста. Можно просто в момент иницализации диалога инициализировать и текст и выделить его - так оно логичнее будет. а пользователь грохнет текст побегает табом по виджетам и будет немножко некрасиво. ну да ладно. kwisp, логика твоего примера имеет ошибку, т.к. когда пользователь начнёт писать, то оно не пусто, а надобы убрать "Введите Текст". ну я честно скажу что не пробовал, однако текст("Введите текст!") же выделен и когда ты начнешь набирать по выделенному то он должен исчезнуть ![]() |
|
|
flankerr |
![]()
Сообщение
#17
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, ну если из этих соображений тогда пожалуй да. Однако когда пользователь фокусируется на ТекстЭдете то уже не так важно ввёл что-то или нет - главное "потрогал".
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 24.6.2025, 6:48 |