Qt sureVisible() не работает в QScrollArea

У меня 2 столбца. Один из столбцов заполнен большим количеством QWidget. Когда я помещаю виджет в столбец, я вызываю этот метод:

void MainWindow::scrollToItem(Product_View *item) {
    QPoint point = item->mapToParent(QPoint());
    ui->scrollArea->ensureVisible(point.x(), point.y());
}

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

Но когда я возвращаю виджет обратно в первый столбец, он прокручивается, но не полностью вниз. Его размер составляет около 150 пикселей (EDIT: 150 пикселей не соответствует действительности. Я вижу только около 5 пикселей виджета)

Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ:

может быть, полезно знать мой макет.

У меня есть главное окно с QScrollArea. ScrollArea имеет QWidget с именем scrollAreaWidgetContents и имеет QHBoxLayout. Виджет имеет 5 столбцов. И у них есть QVBoxLayout для моих виджетов перетаскивания.

ДРУГОЕ ИЗМЕНЕНИЕ:

Я заметил, что это идет не так только с последним пунктом.

ПРОСТО ПРОДОЛЖАЮ РЕДАКТИРОВАТЬ

Теперь мне ясно, что полоса прокрутки просто не опускается до конца.

QScrollBar *bar = ui->scrollArea->verticalScrollBar();
bar->setValue(bar->maximum());

Этот код также показывает такое же поведение. Что мне делать с этой веткой? И стоит ли создавать новый?


person HansElsen    schedule 12.01.2013    source источник


Ответы (3)


Функция ensureVisible принимает только точку, поэтому ее использование гарантировать, что один угол вашего виджета виден (я полагаю, верхний левый?). Вместо этого попробуйте использовать ensureWidgetVisible — это должно гарантировать, что весь виджет это на экране.

Надеюсь, это поможет!

person Xavier Holt    schedule 12.01.2013
comment
Спасибо за ваш ответ. Вы правы в использовании ensureWidgetVisible. Но я сделал это раньше с теми же результатами. - person HansElsen; 12.01.2013

Я нашел свою проблему. Не решение.

Если я перетащу виджет обратно в первый столбец, мой код вызовет ensureWidgetVisible. После этого моя область прокрутки изменяется из-за нового элемента. Вот почему мой виджет не полностью виден.

person HansElsen    schedule 12.01.2013

Хотя это более старый пост, я столкнулся с той же проблемой, и это доставило мне много проблем с поиском решения.

Моя проблема: пришлось добавить новую строку в виджет, а затем убедиться, что полоса прокрутки прокручивается до нее, чтобы люди могли ее просматривать. ОП хорошо описывает проблему в своем ответе.

Я пробовал следующее:
1. (Лучший способ) вызвать processEvents() для объекта приложения. Я попробовал это после того, как увидел эту запись и ответ Рациана .

2. Реализуйте свою пользовательскую область прокрутки, которая расширяет QScrollArea, и переопределите обработчик изменения размера, чтобы иметь возможность вызывать метод sureWidgetVisible для добавленного виджета. Конечно, он каким-то образом должен знать об этом объекте виджета.

3. Добавьте QTimer и запустите таймер при добавлении нового виджета. Метод, который вызывает таймер, должен будет вызвать метод sureWidgetVisible() для нового объекта виджета, а затем остановить таймер.

Я знаю, что 3 немного хакерский, поскольку он не знает, когда произошло событие изменения размера, и поэтому таймер должен быть установлен на неоптимальное значение. (например, изменение размера вызывается через 33 мс, и вы устанавливаете таймер на 500 мс, вы поняли).

Я надеюсь, что это поможет людям, которые борются с той же проблемой.

person limbo    schedule 03.08.2016