Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июль 08, 2009, 10:34



Название: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?
Отправлено: xintrea от Июль 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 работает.


Название: Re: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?
Отправлено: spectre71 от Июль 08, 2009, 10:42
Возможно использовать QTextDocument


Название: Re: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?
Отправлено: uriel от Июль 08, 2009, 10:47
Вот кстати да. Для меня вопрос сейчас тоже актуален, правда в более общем виде: до отображения размеры и позиции всех виджетов не соответствуют действительности, а действия с ними требуется выполнять именно до отображения.
Где-то вопрос решил установкой фильтра событий и запуском инициализации при первом QEvent::Show, но в других местах этот способ не подходит. Была сумасшедшая идея показывать сначала окно в (-__INT_MAX__,-__INT_MAX__), чтобы точно не было видно, но как-то оно меня смущает. :)


Название: Re: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?
Отправлено: xintrea от Июль 08, 2009, 10:53
Для меня вопрос сейчас тоже актуален, правда в более общем виде: до отображения размеры и позиции всех виджетов не соответствуют действительности, а действия с ними требуется выполнять именно до отображения.

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

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

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


Название: Re: Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?
Отправлено: xintrea от Июль 08, 2009, 11:36
Возможно использовать QTextDocument

Ага, нашел.

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

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