Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: maybell от Июль 21, 2008, 21:06



Название: сохранение позиции slider'a в QTextEdit
Отправлено: maybell от Июль 21, 2008, 21:06
 Имеется html-отчет о заданиях пользователя. Выглядит как табличка с описанием и статусами (Выполнил, Ознакомлен и тп).
Отчет постоянно обновляется (появляются новые задания, выполненные проверяются) и при каждом обновлении страница с отчетом прыгает наверх, т.е. пользователь теряет задание на котором находится. В общем необходимо зафиксировать каким-то образом позицию в отчете..
Была попытка через anchor сохранить текущую позицию, но опять же пользователь может не кликать  на задании, а просто проскроллить текст..
Вопрос: Каким образом возможно сохранить текущую позицию бегунка скроллера?
У класса QTextEdit нет наследуемых классов от QSlider, есть только QScrollArea.
Были попытки типа:
QSlider slider=new QSlider(text);//пробовался и frame
slider_position=slider->SliderPosition;
slider->setSliderPosition(slider_position);
slider->setValue(slider_position);

К сожалению, кода под рукой нет, но хотелось бы услышать какие-нибудь предложения, доводы и замечания..
Qt 4.1.2


Название: Re: сохранение позиции slider'a в QTextEdit
Отправлено: spirit от Июль 21, 2008, 21:13
Код:
QScrollBar * QTextEdit::verticalScrollBar () const

а QScrollBar наследуется от QAbstractSlider.
ну а дальше ассистант.


Название: Re: сохранение позиции slider'a в QTextEdit
Отправлено: pastor от Июль 21, 2008, 21:16
Вопрос: Каким образом возможно сохранить текущую позицию бегунка скроллера?

Узнать позицию можно например так:

Код:
int hor_pos = textedit->horizontalScrollBar()->value();
int ver_pos = textedit->verticalScrollBar()->value();


Название: Re: сохранение позиции slider'a в QTextEdit
Отправлено: axinedy от Июль 13, 2010, 13:06
Цитировать
и при каждом обновлении страница с отчетом прыгает наверх, т.е. пользователь теряет задание на котором находится. В общем необходимо зафиксировать каким-то образом позицию в отчете..
Столкнулся с аналогичной проблемой...

использование такого подхода:
Код:
//перед обновлением:
ver_pos = textedit->verticalScrollBar()->value();
...
//а после обновления:
textedit->verticalScrollBar()->setValue(ver_pos);
Приводит к тому, что позиция возвращается лишь примерно (текст прыгает около того места, где надо), т.к. у textedit стоит опция переноса слов (и максимальное значение скроллбара может меняться), если сделать
Код:
textedit->setWordWrapMode(QTextOption::NoWrap);
то позиция железно сохраняется где надо (т.к. количество строк одинаковое, хотя они могут быть разной длины), но появляется ненужная прокрутка по горизонтали...
Попытка сохранять и восстанавливать позицию следующим образом:
Код:
//перед обновлением текста
textedit->setWordWrapMode(QTextOption::NoWrap);
textedit->update();
ver_pos = textedit->verticalScrollBar()->value();
textedit->setWordWrapMode(QTextOption::WordWrap);
...
//после замены текста
textedit->setWordWrapMode(QTextOption::NoWrap);
textedit->update();
textedit->verticalScrollBar()->setValue(ver_pos);
textedit->setWordWrapMode(QTextOption::WordWrap);
почему-то не даёт результата - позиция опять скачет около нужного места...
Если заменить  textedit->update() на  textedit->repaint() видно, что обновление происходит - горизонтальная прокрутка появляется и тут же исчезает, но позиция "скачет"...

Что можно сделать?