Russian Qt Forum

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



Название: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 06, 2008, 20:30
Помогите пожалуйста. Такое вот дело. Есть у меня QScrollArea в которой установлен QWidget с вертикальным лейаутом.
В лейаут у меня добавляются мой виджет(он вмещает QLabel и QTextEdit) по клику на панели или комбинации клавиш.
нужно чтобы они были сразу видны (QScrollArea прокручивалась) когда добавлялись, ато когда выходи за границы, QScrollArea остается на том же месте. пылался сделать это через setFocus() для QTextEdit'а - он оказывается в фокусе, но QScrollArea не прокручивается (проверял это нажимая на клавиши - надписи в новом виджете оставались). пытался делать это через ensureWidgetVisible() - тоже не получается, он прокручивается но коряво, так что все равно нужного виджета не видно.
пытался тоже самое проделывать на уже созданных виджетах и без одновременного создания новых - ensureWidgetVisible() работает нормально и корректно показывает то что надо.
Помоему загвоздка в том, что когда добавляется в лейаут виджет, QScrollArea не успевает обновится и ensureWidgetVisible() работает неправильно. А мне нужно какраз когда создается новый виджет


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Alex03 от Июль 07, 2008, 07:41
Цитировать
widgetResizable : bool

This property holds whether the scroll area should resize the view widget.

If this property is set to false (the default), the scroll area honors the size of its widget. Regardless of this property, you can programmatically resize the widget using widget()->resize(), and the scroll area will automatically adjust itself to the new size.

If this property is set to true, the scroll area will automatically resize the widget in order to avoid scroll bars where they can be avoided, or to take advantage of extra space.

Access functions:
bool widgetResizable () const
void setWidgetResizable ( bool resizable )
Оно?


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 07, 2008, 08:48
Цитировать
widgetResizable : bool

This property holds whether the scroll area should resize the view widget.

If this property is set to false (the default), the scroll area honors the size of its widget. Regardless of this property, you can programmatically resize the widget using widget()->resize(), and the scroll area will automatically adjust itself to the new size.

If this property is set to true, the scroll area will automatically resize the widget in order to avoid scroll bars where they can be avoided, or to take advantage of extra space.

Access functions:
bool widgetResizable () const
void setWidgetResizable ( bool resizable )
Оно?
нет. мне надо чтобы когда я добавлял чтото в QScrollArea она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Alex03 от Июль 07, 2008, 11:54
нет. мне надо чтобы когда я добавлял чтото в QScrollArea она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?
Сам же говоришь что когда всё заранее вставленно то прокручивается нормально.
Потому я и предположил что когда вставляешь элементы после добавления в QScrollArea, то размеры вьюпорта QScrollArea не пересчитываются.

Т.е. я предложил при создании QScrollArea вызвать setWidgetResizable(true), а уж остальное делать как и раньше, т.е. ensureWidgetVisible().


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 07, 2008, 12:08
нет. мне надо чтобы когда я добавлял чтото в QScrollArea она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?
Сам же говоришь что когда всё заранее вставленно то прокручивается нормально.
Потому я и предположил что когда вставляешь элементы после добавления в QScrollArea, то размеры вьюпорта QScrollArea не пересчитываются.

Т.е. я предложил при создании QScrollArea вызвать setWidgetResizable(true), а уж остальное делать как и раньше, т.е. ensureWidgetVisible().
не помогло. все тоже самое ???


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: ритт от Июль 07, 2008, 12:28
тогда приложи код (желательно, компилябельный проект) - и не будем угадывать где и что у тебя не фунциклирует


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: EhTemka от Июль 07, 2008, 16:01
А что если resizeEvent ( QResizeEvent * event ) переписать у QScrollArea. В него добавить операции по перемещению скрола... При вставке виджета должен размер менятся. Хотя наверно не у самой ареи а у егошного виджета


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 07, 2008, 19:55
А что если resizeEvent ( QResizeEvent * event ) переписать у QScrollArea. В него добавить операции по перемещению скрола... При вставке виджета должен размер менятся. Хотя наверно не у самой ареи а у егошного виджета
пытался прикрутить к focusInEvent в QTextEditor но не получилось. попробую как вы написали

Код прикрепил
ЗЫ надо установить курсор в текстовое поле внизу и жать Enter - поля будут добавляться


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: ритт от Июль 07, 2008, 20:54
чего-то ты накосячил...
по контрол+вниз/вверх отрабатывает как и задумано
а вот в insertAnswerEditor ensureWidgetVisible вообще не участвует
вот этот кусок тоже вызывает сомнения о его уместности и правильности здесь:
Код:
	answerPointers.insert(index, new AnswerEditor());
answersLayout->insertWidget(index,answerPointers[answersCount]);
в вектор указатель на виджет вставляешь в позицию index, а на лэйоут ложишь последний из вектора


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 07, 2008, 21:35
чего-то ты накосячил...
по контрол+вниз/вверх отрабатывает как и задумано
а вот в insertAnswerEditor ensureWidgetVisible вообще не участвует
вот этот кусок тоже вызывает сомнения о его уместности и правильности здесь:
Код:
	answerPointers.insert(index, new AnswerEditor());
answersLayout->insertWidget(index,answerPointers[answersCount]);
в вектор указатель на виджет вставляешь в позицию index, а на лэйоут ложишь последний из вектора
о да спасибо, а то я не заметил - оптимизировал код и сгрузил все в кучу. раньше у меня были 3 разные почти одинаковые функции. ensureWidgetVisible я всетаки стер когда он не работал
был он у меня перед answerPointers[index]->textEdit()->setFocus(); а передавал я в него answerPointers[index]. где только я его еще не вставлял - везде было одно и тоже.


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: ритт от Июль 07, 2008, 22:37
исправил и чуть доработал твой код - работает как надо
добавь ensureWidgetVisible перед setFocus, пиши вимательно и читай документацию

зы. ещё советую оптимизировать хранение и передачу переменных + освоить какой-нибудь стилизатор кода (или непосредственно стиль)


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 07, 2008, 23:08
исправил и чуть доработал твой код - работает как надо
добавь ensureWidgetVisible перед setFocus, пиши вимательно и читай документацию

зы. ещё советую оптимизировать хранение и передачу переменных + освоить какой-нибудь стилизатор кода (или непосредственно стиль)
а можно поподробнее насчет ensureWidgetVisible? он у меня и стоял перед setFocus но почемуто неработал... Qt 4.4.0, WinXP SP3.

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


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: ритт от Июль 08, 2008, 13:36
> ensureWidgetVisible - он у меня и стоял перед setFocus но почемуто неработал...
работал. просто не правильно, т.к. пытался показать не тот виджет, которыый тебе хотелось - сам виноват

> я только начал писать на Qt и вообще в программировании новичок.
из кода сразу становится ясно, что новичёк. пишешь ты неоптимально и как можно понятнее писать не получается - очень всё запутано :)


Название: Re: Не прокручивается QScrollArea при создании в ней объектов
Отправлено: Hort от Июль 08, 2008, 16:33
> ensureWidgetVisible - он у меня и стоял перед setFocus но почемуто неработал...
работал. просто не правильно, т.к. пытался показать не тот виджет, которыый тебе хотелось - сам виноват

> я только начал писать на Qt и вообще в программировании новичок.
из кода сразу становится ясно, что новичёк. пишешь ты неоптимально и как можно понятнее писать не получается - очень всё запутано :)

я передавал в ensureWidgetVisible answerPointers[index]- это получается указатель на прямого потомка виджета установленного в QScrollArea. пробовал на answerPointers[index]->textEditor() - но тогда он вообще не работает. у меня есть функция в которой тоже используется ensureWidgetVisible - это void EditorDocWindow::slotEditAnswer(), там тоже используется обращение через answerPointers и нормально работает.