пятница, 27 января 2012 г.

Размещение виджета в центре QScrollArea

Только что столкнулся в Qt с тривиальной задачей, на решение которой у меня ушло более часа - видимо подвел тип мышления, развитый многими годами работы с библиотекой VCL.

Задача такая. Необходимо разместить виджет в скроллингуемой области QScrollArea. При этом, возможно два случая. В первом случае, размер размещаемого виджета больше размеров QScrollArea. Это нормальный случай использования скроллингуемых областей. Здесь нужно просто настроить работу скроллеров согласно документации на QScroolArea. Во втором случае, размер размещаемого виджета меньше размеров QScrollArea. В этом, не таком уж редком случае использования QScrooArea, хочется видеть размещаемый виджет в центре скроллингуемой области. И вот на эту простую задачу я и потратил неправомерно много времени, о чем и решил сейчас рассказать.

Если не погружаться в те заблуждения, которые повлияли на поиск решения, то следует признаться, что решение совершенно типично для Qt и проблемы были именно во влиянии VCL. Однако, на случай разного рода иных влияний, возможно, для кого-то эти строки окажутся полезными.

Решение выглядит следующим образом.

QScrollArea *area = new QScrollArea(parent_widget);

    MyWidget myWidget = new MyWidget(area);

    // ключ к решению - менеджер размещения с необходимой настройкой по выравниванию
    QVBoxLayout *vb = new QVBoxLayout(area->viewport());
    vb->addWidget(myWidget);
    vb->setAlignment(myWidget, Qt::AlignCenter);

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