У меня есть — может быть, немного необычная — проблема:
У меня есть QTabWidget. Приложение читает записи из источника данных. Записи содержат (помимо другой информации) поля «pos-x» и «pos-y», и приложение должно для каждой записи помещать кнопку на вкладке в позиции сетки (x, y). Эти кнопки имеют «фиксированный» размер, выбранный пользователем, который читается через Config-Object из INI-файла. Если эта «сетка кнопок» становится слишком большой для пространства вкладки, должны появиться полосы прокрутки.
Сначала я подумал, что это очень легко и просто. Что-то вроде «поместите QScrollArea на закладку, поместите QGridLayout в эту QScrollarea. Вот и все». Но потом я понял, что это совсем не просто.
Насколько я понимаю, «разметка и воспитание» в Qt, все наоборот. (Пожалуйста, поправьте меня, если я ошибаюсь!). «Обычно», окружающий виджет определяет размер Layout-менеджера (например, QGridLayout), который он содержит, и Layout-менеджер затем определяет размеры дочерних элементов, которые он содержит.
Но я считать, Мне нужно «противоположное направление». У меня есть кнопки фиксированного размера, мне нужна сетка из n-рядов по m-столбцам, что приводит к итоговому размеру всей сетки-макета. И если весь макет не подходит, прокрутка должна активировать полосы прокрутки.
Так что теперь я немного запутался в этой тайне, задаваясь вопросом, как «правильно» сделать это. Может быть, кто-то может пнуть меня в правильном направлении … ??
Большое спасибо!
Является этот Что вы хотите получить? Если это так, попробуйте установить виджет в области прокрутки, а не в макете. Положите кнопки на виджет.
Затем, если вы имеете в виду, что pos-x и pos-y являются абсолютными, вам не нужно устанавливать макет на виджете. Просто создайте дочерние кнопки и установите их геометрию так, как вам нужно:
// Suppose we read this info from a config file
int pbWidth = 150, pbHeight = 30;
// and this one from a datasource
QVector<QPoint> positions;
positions.push_back(QPoint(10, 10));
positions.push_back(QPoint(50, 50));
positions.push_back(QPoint(210, 30));
QTabWidget *tabWidget = new QTabWidget();
QScrollArea *scrollArea = new QScrollArea();
QWidget *scrollAreaWidget = new QWidget();
// We put a container widget inside the scroll area
scrollArea->setWidget(scrollAreaWidget);
// then we add the scroll area as the tab
tabWidget->addTab(scrollArea, tr("Tab 1"));
// Now let's put some push buttons on the widget
for (QVector<QPoint>::ConstIterator i = positions.cbegin();
i != positions.cend(); i++)
{
QString text = tr("Button at %1x%2").arg(i->x()).arg(i->y());
// We have to pass the parent to the constructor
// to place pb on the widget
QPushButton *pushButton = new QPushButton(text, scrollAreaWidget);
// Here we set position and size
pushButton->setGeometry(i->x(), i->y(), pbWidth, pbHeight);
}
// We have no layout on the widget, so don't forget to adjust size
scrollAreaWidget->adjustSize();
Других решений пока нет …