固定大小的按钮布置在gridlayout中,具有预定义的行数/列数

时间:2017-03-10 20:55:27

标签: c++ qt grid-layout

我有一个 - 也许有点不寻常 - 问题:

我有一个QTabWidget。应用程序从数据源读取记录。记录包含(除了其他信息)a" pos-x"和" pos-y"字段和应用程序应为每个记录在标签页上的一个网格位置(x,y)放置一个按钮。这些按钮有一个固定的"大小,由用户选择,通过ini文件中的Config-Object读取。如果这个"按钮网格"对于标签页的空间来说太大了,滚动条会出现。

首先,我认为这非常容易和直截了当。类似于"在标签页上放置一个QScrollArea,将QGridLayout放入此QScrollarea。那是"。但后来我意识到这不过是简单的。

据我了解Qt"布局和育儿",它恰恰相反。 (如果我错了,请纠正我!)。 "通常",周围的小部件调整它包含的Layout-manager(例如QGridLayout)的大小,然后Layout-manager调整它包含的子节点的大小。

但我认为,我需要"相反的方向"。我有一个固定大小的按钮,需要一个由m列组成的n行网格,这会导致整个网格布局的结果大小。如果整个布局不合适,则滚动区域应激活它的滚动条。

所以我现在有点迷失在这个谜中,想知道如何正确地#34;做这个。也许有人可以踢我正确的方向...... ??

非常感谢!

1 个答案:

答案 0 :(得分:0)

this你想得到什么?如果是这样,请尝试在滚动区域设置小部件,而不是布局。在窗口小部件上放置一个按钮。

然后,如果你的意思是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();