QScrollArea :: sureVisible () и QScrollArea :: setWidget ()

Я столкнулся с другой проблемой QScrollAreaпосле того, как я получил помощь для предыдущий, что было несколько похоже.

Проблема в том, что ensureVisible() ничего не делает, если вы создаете область прокрутки и метку, устанавливаете метку как виджет области прокрутки, а затем загружаете изображение в метку — после setWidget():

Этот пример иллюстрирует проблему, просто замените /path/to/some/image.png с некоторым реальным изображением на вашем компьютере:

QScrollArea *scrollArea = new QScrollArea;
QLabel *label = new QLabel(scrollArea);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(label);
label->setPixmap(QPixmap("/path/to/some/image.png"));
label->setFixedSize(label->pixmap()->size());
scrollArea->ensureVisible(10000, 10000);
scrollArea->show();

Если setPixmap() называется до setWidget(), ensureVisible() буду работать.

Кроме того, проблема воспроизводима, хотя я звоню setWidgetResizable() и даже setFixedSize(),

Почему это происходит, и можно ли сделать ensureVisible() работать без изменения порядка setWidget() а также setPixmap()?

0

Решение

Когда вы звоните ensureVisible(10000, 10000); scrollArea еще не настроил размер виджета. Вот почему это не сработает.

Если вы создаете слот, который вызывает ensureVisible и использовать QTimer::singleShot чтобы вызвать этот слот с тайм-аутом, установленным в 0 (вы также можете использовать QMetaObject::invokeMethod с подключением к очереди), это будет работать, даже если вы установите виджет области прокрутки, прежде чем установить растровое изображение на метку.

Что также работает, если вы звоните ensureVisible после звонка show, Но это работает только если ваш scrollArea это окно верхнего уровня. Если вы вставите его в виджет, он не будет работать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]