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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не прокручивается QScrollArea при создании в ней объектов  (Прочитано 8153 раз)
Hort
Гость
« : Июль 06, 2008, 20:30 »

Помогите пожалуйста. Такое вот дело. Есть у меня QScrollArea в которой установлен QWidget с вертикальным лейаутом.
В лейаут у меня добавляются мой виджет(он вмещает QLabel и QTextEdit) по клику на панели или комбинации клавиш.
нужно чтобы они были сразу видны (QScrollArea прокручивалась) когда добавлялись, ато когда выходи за границы, QScrollArea остается на том же месте. пылался сделать это через setFocus() для QTextEdit'а - он оказывается в фокусе, но QScrollArea не прокручивается (проверял это нажимая на клавиши - надписи в новом виджете оставались). пытался делать это через ensureWidgetVisible() - тоже не получается, он прокручивается но коряво, так что все равно нужного виджета не видно.
пытался тоже самое проделывать на уже созданных виджетах и без одновременного создания новых - ensureWidgetVisible() работает нормально и корректно показывает то что надо.
Помоему загвоздка в том, что когда добавляется в лейаут виджет, QScrollArea не успевает обновится и ensureWidgetVisible() работает неправильно. А мне нужно какраз когда создается новый виджет
Записан
Alex03
Гость
« Ответ #1 : Июль 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 )
Оно?
Записан
Hort
Гость
« Ответ #2 : Июль 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 она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?
Записан
Alex03
Гость
« Ответ #3 : Июль 07, 2008, 11:54 »

нет. мне надо чтобы когда я добавлял чтото в QScrollArea она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?
Сам же говоришь что когда всё заранее вставленно то прокручивается нормально.
Потому я и предположил что когда вставляешь элементы после добавления в QScrollArea, то размеры вьюпорта QScrollArea не пересчитываются.

Т.е. я предложил при создании QScrollArea вызвать setWidgetResizable(true), а уж остальное делать как и раньше, т.е. ensureWidgetVisible().
Записан
Hort
Гость
« Ответ #4 : Июль 07, 2008, 12:08 »

нет. мне надо чтобы когда я добавлял чтото в QScrollArea она мне сразу и показывала добавленный элемент (прокручивалась в нужную часть). как это связанно с изменением размеров виджета?
Сам же говоришь что когда всё заранее вставленно то прокручивается нормально.
Потому я и предположил что когда вставляешь элементы после добавления в QScrollArea, то размеры вьюпорта QScrollArea не пересчитываются.

Т.е. я предложил при создании QScrollArea вызвать setWidgetResizable(true), а уж остальное делать как и раньше, т.е. ensureWidgetVisible().
не помогло. все тоже самое Непонимающий
Записан
ритт
Гость
« Ответ #5 : Июль 07, 2008, 12:28 »

тогда приложи код (желательно, компилябельный проект) - и не будем угадывать где и что у тебя не фунциклирует
Записан
EhTemka
Гость
« Ответ #6 : Июль 07, 2008, 16:01 »

А что если resizeEvent ( QResizeEvent * event ) переписать у QScrollArea. В него добавить операции по перемещению скрола... При вставке виджета должен размер менятся. Хотя наверно не у самой ареи а у егошного виджета
« Последнее редактирование: Июль 07, 2008, 16:04 от EhTemka » Записан
Hort
Гость
« Ответ #7 : Июль 07, 2008, 19:55 »

А что если resizeEvent ( QResizeEvent * event ) переписать у QScrollArea. В него добавить операции по перемещению скрола... При вставке виджета должен размер менятся. Хотя наверно не у самой ареи а у егошного виджета
пытался прикрутить к focusInEvent в QTextEditor но не получилось. попробую как вы написали

Код прикрепил
ЗЫ надо установить курсор в текстовое поле внизу и жать Enter - поля будут добавляться
« Последнее редактирование: Июль 07, 2008, 19:59 от Hort » Записан
ритт
Гость
« Ответ #8 : Июль 07, 2008, 20:54 »

чего-то ты накосячил...
по контрол+вниз/вверх отрабатывает как и задумано
а вот в insertAnswerEditor ensureWidgetVisible вообще не участвует
вот этот кусок тоже вызывает сомнения о его уместности и правильности здесь:
Код:
	answerPointers.insert(index, new AnswerEditor());
answersLayout->insertWidget(index,answerPointers[answersCount]);
в вектор указатель на виджет вставляешь в позицию index, а на лэйоут ложишь последний из вектора
Записан
Hort
Гость
« Ответ #9 : Июль 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]. где только я его еще не вставлял - везде было одно и тоже.
Записан
ритт
Гость
« Ответ #10 : Июль 07, 2008, 22:37 »

исправил и чуть доработал твой код - работает как надо
добавь ensureWidgetVisible перед setFocus, пиши вимательно и читай документацию

зы. ещё советую оптимизировать хранение и передачу переменных + освоить какой-нибудь стилизатор кода (или непосредственно стиль)
Записан
Hort
Гость
« Ответ #11 : Июль 07, 2008, 23:08 »

исправил и чуть доработал твой код - работает как надо
добавь ensureWidgetVisible перед setFocus, пиши вимательно и читай документацию

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

я только начал писать на Qt и вообще в программировании новичок. писать пытаюсь сразу наиболее оптимально, но похоже не получается (наверно из-за маленького опыта). насчет стиля надо действительно чтото глянуть, но сейчас полагаюсь только на свою интуицию и стараюсь писать как можно понятнее.
Записан
ритт
Гость
« Ответ #12 : Июль 08, 2008, 13:36 »

> ensureWidgetVisible - он у меня и стоял перед setFocus но почемуто неработал...
работал. просто не правильно, т.к. пытался показать не тот виджет, которыый тебе хотелось - сам виноват

> я только начал писать на Qt и вообще в программировании новичок.
из кода сразу становится ясно, что новичёк. пишешь ты неоптимально и как можно понятнее писать не получается - очень всё запутано Улыбающийся
Записан
Hort
Гость
« Ответ #13 : Июль 08, 2008, 16:33 »

> ensureWidgetVisible - он у меня и стоял перед setFocus но почемуто неработал...
работал. просто не правильно, т.к. пытался показать не тот виджет, которыый тебе хотелось - сам виноват

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

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


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