QScrollArea - странные размеры области отображения

Модератор: Модераторы разделов

Аватара пользователя
Алан
Сообщения: 18
ОС: Debian

QScrollArea - странные размеры области отображения

Сообщение Алан »

Проблема такая: есть MainWindow, на нем центральным виджетом установлен Label (занимает все свободное место). Label отображает pixmap. Все это собираю в дизайнере. Теперь требуется поместить Label внутрь ScrollArea.
Делаем (в коде прописываем) ScrollArea центральным виджетом, Label дочерним по отношению к ScrollArea. В результате получаем очень старнные размеры области ScrollArea (раза в полтора меньше размеров формы). Не понимаю, откуда эти размеры берутся, т.к. установка basesize и sizepolicy ни у Label ни у ScrollArea на размеры области отображения не влияет.

Если руками делать ScrollArea.resize(...) все замечательно работает. Или, например, задавать базовые размеры виджета и вызывать adjustSize - тоже все работает.

А вот почему без ручного ресайза криво получается я не понимаю.

Использую Qt (дизайнер, заголовочные файлы и т.д.) версии 4.3.2.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: QScrollArea - странные размеры области отображения

Сообщение eduard_pustobaev »

Что-то много действий.

Код: Выделить всё

QLabel *label = new QLabel;
QScrollArea *scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(label);

Вот так вот не достаточно?
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Алан
Сообщения: 18
ОС: Debian

Re: QScrollArea - странные размеры области отображения

Сообщение Алан »

Нет, не достаточно. Как MainWindow "узнает", что на форму нужно добавить ScrollArea вместе с Label? Я так понимаю, для этого нужно сделать ScrollArea дочерним по отношению к MainWindow (например, вызвав конструктор ScrollArea( QWidget * parent = 0 ).

Таким образом, мой код выглядит так:

Код: Выделить всё

ScrollArea = new QScrollArea(centralwidget);
ScrollArea->setWidget(label);
scrollArea->setBackgroundRole(QPalette::Dark);
Ничего лишнего.

Для создания формы я использую дизайнер, поэтому Label мне вручную создавать не надо (хотя я пробовал и вручную).
А если не привязывать ScrollArea к форме, будет создано отдельное окно, в котором и будет отображена ScrollArea. А размеры этого окна будут равны тем самым "странным" размерам, которые ScrollArea принимает, если привязать ее к основной форме.

А если все делать вручную, без использования дизайнера - никаких проблем.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: QScrollArea - странные размеры области отображения

Сообщение eduard_pustobaev »

Как MainWindow "узнает", что на форму нужно добавить ScrollArea вместе с Label? Я так понимаю, для этого нужно сделать ScrollArea дочерним по отношению к MainWindow (например, вызвав конструктор ScrollArea( QWidget * parent = 0 ).

Код: Выделить всё

QMainWindow::setCentralWidget ( QWidget * widget );
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Алан
Сообщения: 18
ОС: Debian

Re: QScrollArea - странные размеры области отображения

Сообщение Алан »

Код: Выделить всё

QMainWindow::setCentralWidget ( QWidget * widget );

А зачем? Я собираю форму в дизайнере. Label автоматически становится центральным виджетом, это очень хорошо видно и в инспекторе объектов самого дизайнера, и в заголовочном файле формы, после компиляции.

Код: Выделить всё

ScrollArea = new QScrollArea(centralwidget);
ScrollArea->setWidget(label);
, если я правильно понимаю, сделает ScrollArea центральным виджетом, а Label дочерним по отношению к ScrollArea.

И все равно не понятно, откуда берутся размеры ScrollArea. Ну вот создается она в отдельном окне, а почему размеры окна не равны размерам Label? В Assistant'e читаем:
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.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: QScrollArea - странные размеры области отображения

Сообщение eduard_pustobaev »

Код: Выделить всё

#include <QApplication>
#include <QMainWindow>
#include <QScrollArea>
#include <QLabel>
#include <QImage>

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);

  QMainWindow *mainWindow = new QMainWindow();

  QLabel *imageLabel = new QLabel;
  QImage image("/home/ed/temp/1/nimbus_xfce.png");
  imageLabel->setPixmap(QPixmap::fromImage(image));

  QScrollArea *scrollArea = new QScrollArea;
  scrollArea->setBackgroundRole(QPalette::Dark);
  scrollArea->setWidget(imageLabel);

  mainWindow->setCentralWidget(scrollArea);

  mainWindow->show();

  return app.exec();
}


Скажите, что не так делает этот код. А то как-то не совсем ясно, в чём проблема.
В дисгармонии со вселенной.
Спасибо сказали: