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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?  (Прочитано 4351 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июль 08, 2009, 10:34 »

Здравствуйте!


Задача такая - нужно узнать координаты начальной позиции курсора во временном объекте QTextEdit. Получить координаты не проблема. Проблема в другом - эти координаты неправильные до того момента, пока объект QTextEdit не будет по-настоящему отрисован.

То есть, код

Код:
QTextEdit txted;
txted.raise();
txted.show();
txted.repaint();

QTextCursor control_cur=txted.textCursor();
control_cur.setPosition(0);
QRect control_cur_rect=cursorRect(control_cur);

qDebug() << "Control cursor X Y Width" << control_cur_rect.x() << " " << control_cur_rect.y() << " " << this->lineWidth();

Всегда будет показывать

Код:
Control cursor X Y Width 0   0   1

хотя, если унаследоваться от QTextEdit, засунуть в paintEvent() вывод отладочной информации

Код:
qDebug() << "Control cursor in paintEvent X Y Width" << textCursor().x() << " " << textCursor().y() << " " << this->lineWidth();

то в логе увидим правильные данные

Код:
Control cursor in paintEvent X Y Width 4   4   1

Правда, данные эти увидим только в том случае, если этот унаследованный объект засунем на форму и запустим форму на исполнение. А вот если его использовать напрямую (пускай он называется TextEditExtention)
 
Код:
TextEditExtention txted;
txted.raise();
txted.show();
txted.repaint();

то во время выполнения этого кода paintEvent() всеравно не вызывается, и координаты курсора после такого кода останутся равными 0,0.


Вот и получается непонятка - как узнать настоящие координаты курсора в "начальной" позиции? Я уже думаю создавать дополнительное модальное окно, помещать на него QTextEdit, рисовать окно, по таймеру удалять, а перед удалением брать координаты курсора у QTextEdit. Но такая конструкция не есть правильно - будет мелькать непонятное окошко, что будет сильно раздражать. К тому же по таймеру работать с GUI не есть гуд, так как если поставить маленькую задержку, окно может не успеть отрисоваться, и это зависит от загруженности компа, и еще от кучи факторов..

Вопрос - как сделать более просто? Задача вроде простецкая, но долблюсь уже вторую неделю в несколько заходов, ибо не до конца понимаю как эта блин отрисовка и инициализация виджетов в Qt работает.
Записан

Собираю информацию по крупицам
http://webhamster.ru
spectre71
Гость
« Ответ #1 : Июль 08, 2009, 10:42 »

Возможно использовать QTextDocument
Записан
uriel
Гость
« Ответ #2 : Июль 08, 2009, 10:47 »

Вот кстати да. Для меня вопрос сейчас тоже актуален, правда в более общем виде: до отображения размеры и позиции всех виджетов не соответствуют действительности, а действия с ними требуется выполнять именно до отображения.
Где-то вопрос решил установкой фильтра событий и запуском инициализации при первом QEvent::Show, но в других местах этот способ не подходит. Была сумасшедшая идея показывать сначала окно в (-__INT_MAX__,-__INT_MAX__), чтобы точно не было видно, но как-то оно меня смущает. Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Июль 08, 2009, 10:53 »

Для меня вопрос сейчас тоже актуален, правда в более общем виде: до отображения размеры и позиции всех виджетов не соответствуют действительности, а действия с ними требуется выполнять именно до отображения.

Во, ты правильно сформулировал.

Где-то вопрос решил установкой фильтра событий и запуском инициализации при первом QEvent::Show, но в других местах этот способ не подходит. Была сумасшедшая идея показывать сначала окно в (-__INT_MAX__,-__INT_MAX__), чтобы точно не было видно, но как-то оно меня смущает. Улыбающийся

Тоже идея... Тока боюсь что некотрые виндовменеджеры не позволят рисовать окно с отрицательными координатами, будут искусственно в 0,0 переводить, и таки мерцать оно будет. Ну и свё та же проблема синхронизации - нужно городить код чтоб он ожидал, когда все объекты проинициализируются правильно.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Июль 08, 2009, 11:36 »

Возможно использовать QTextDocument

Ага, нашел.

Код:
QTextEdit edit;
x=edit.document().documentMargin();

впринципе, нужна была именно X-координата. Введено в Qt 4.5.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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