Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alp от Сентябрь 14, 2010, 16:30



Название: Editable label
Отправлено: Alp от Сентябрь 14, 2010, 16:30
Надо сделать такую штуку - лейбл, при двойном клике появляется QLineEdit в котором происходит редактирование текста с лейбла. По определенным событиям редактор пропадает, текст в лейбле обновляется.
События, по которым закрывается редактор:
- клик мышью вне области редактора (текст в лейбле обновляется)
- Key_Return (текст в лейбле обновляется)
- Key_Escape (в этом случае текст в лейбле остается старый).

Столкнулся при реализации этой простой задачи с рядом проблем:
1. Для отслеживания клика мышью вызываю у редактора grabMouse, в котором проверяю принадлежность координаты прямоугольнику редактора и делаю вывод о том где кликнул пользователь. Проблема в том, что после вызова grabMouse я ни разу не попадаю в mousePressEvent, более того, подвисает приложение и система до нажатия виндовых шоткатов (типа Ctrl-Escape или Win), т.е. до принудительного отбирания фокуса у приложения. По результатам в консоли отладки видно, что все клики происходившие за время "повисания" отображены, хотя и неизвестно когда обработаны.

2. У QLineEdit есть поганая привычка - добавлять марджины. Если присмотреться к редактору, то видно, что текст не прилипает к рамке, а отсутпает от нее по всем границам. Мне же хочется этим управлять (иначе получается, что при вызове редактора текст "съезжает" вниз-вправо, относительно лейбла). Можо ли это сделать малой кровью?

3. Можно ли вообще отказаться от идеи QLineEdit и обновлять влаги взаимодействия с текстом (даэе как-то это получилось сделать), при этом получая "редактируемый" текст в лейбле? Т.е. лейб в режимередактирования все-равно возвращает свой изначальный текст при вызове text(). Мне же надо получить обновленный.


Название: Re: Editable label
Отправлено: Alp от Сентябрь 14, 2010, 16:57
тестовый проект


Название: Re: Editable label
Отправлено: merke от Сентябрь 14, 2010, 17:47
Вместо лэйбла используй QLineEdit, задай ему соответствующий стайлшит и получится лэбл. Такая тема уже обсуждалась на форуме, поищи.


Название: Re: Editable label
Отправлено: merke от Сентябрь 14, 2010, 17:49
Вот здесь большой пример использования QEvent - http://qt.ucoz.net/publ/primery_ispolzovanija_klassa_qevent/1-1-0-17 Почитай, я уверен, ты там черпнешь много полезного для решения твоей задачи.


Название: Re: Editable label
Отправлено: Alp от Сентябрь 14, 2010, 18:39
Вместо лэйбла используй QLineEdit, задай ему соответствующий стайлшит и получится лэбл. Такая тема уже обсуждалась на форуме, поищи.
Это плохой, негодный вариант. У QLineEdit нельзя запретить выделение и его нельзя сделать "прозрачным". Т.е. когда лежит QLabel на виджете нет нужды думать о том, какой у него цвет. Здесь же надо постоянно обновлять стайлшит если родительский виджет изменил свой цвет.

Насчет QEvent, если честно, не понял с какого боку он может помочь в решении  моей задачи? Как обрабатываются эвенты я и так знаю, вопрос в том почему при grabMouse происходят странности.


Название: Re: Editable label
Отправлено: Drafter от Сентябрь 14, 2010, 23:02
Цитировать
У QLineEdit нельзя запретить выделение и его нельзя сделать "прозрачным".

Попробуйте проявлять больше настойчивости (усидчивости), прежде чем утверждать, что де сделать ничего нельзя. Прозрачность, например, установить очень просто (включите в стиль виджета - "background-color: rgba(0, 0, 0, 0);"). Так же наверняка есть возможность запретить выделение. Просто вы не пытались найти решение :).


Название: Re: Editable label
Отправлено: Alp от Сентябрь 15, 2010, 13:12
Да, чего-то я поторопился, спасибо за идею.


Название: Re: Editable label
Отправлено: SASA от Сентябрь 15, 2010, 17:10
Можно посмотреть реализацию в Ку Те Дизайнере. Там, прям на форме можно редактировать надписи на кнопках, лейблах.


Название: Re: Editable label
Отправлено: Marat(Qt) от Сентябрь 22, 2010, 17:36
margin'ы тоже в stylesheet можно указать