Я столкнулся с другой проблемой 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()
?
Когда вы звоните ensureVisible(10000, 10000);
scrollArea еще не настроил размер виджета. Вот почему это не сработает.
Если вы создаете слот, который вызывает ensureVisible
и использовать QTimer::singleShot
чтобы вызвать этот слот с тайм-аутом, установленным в 0 (вы также можете использовать QMetaObject::invokeMethod
с подключением к очереди), это будет работать, даже если вы установите виджет области прокрутки, прежде чем установить растровое изображение на метку.
Что также работает, если вы звоните ensureVisible
после звонка show
, Но это работает только если ваш scrollArea
это окно верхнего уровня. Если вы вставите его в виджет, он не будет работать.
Других решений пока нет …