LINUX.ORG.RU

[QT4] Как узнать координаты курсора в QTextEdit сразу после создания этого объекта?


0

0

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

Задача такая - нужно узнать координаты начальной позиции курсора во временном объекте 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 работает.


Все, нашел.

QTextEdit edit;
x=edit.document().documentMargin();

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

xintrea
() автор топика

>эти координаты неправильные до того момента, пока объект QTextEdit не будет по-настоящему отрисован.

А отрисован он не будет, до тех пор, пока не отрисован родитель.

>paintEvent() всеравно не вызывается

Если приведённый код находится в конструкторе родителя, то, например, добавление show() перед txted.repaint(), нарисует родителя и позволит сразу выполнить QTextEdit::paintEvent() при вызове QTextEdit::repaint(), и т.д

summatus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.