Qt之QLayout 遍历所有子项

        在使用QLayout做窗口布局时,有时候我们需要对其进行遍历得到子项,一般的我们都是通过自带的函数children()得到一个链表,然后再对链表进行遍历,首先我设置布局如下:

//设置布局
QVBoxLayout *pLayout = new QVBoxLayout;
pLayout->addWidget(wiget1);
pLayout->addWidget(wiget2);
pLayout->addWidget(wiget3);
pLayout->addWidget(wiget4);
pLayout->addWidget(wiget5);
pLayout->setSpacing(SPACE);              //各个控件的间隔
pLayout->setContentsMargins(0, 0, 0, 0); //设置左、上、右、下的外边距

ui->wgBackGround->setLayout(pLayout); 

        但是我发现对于QLayout这行不通,后来我才发现children()得到的对象是QLayout,而我设置的布局中只有一个QVBoxLayout(往其中添加wiget) ,所以pLayout->children().count()个数只有1,代码如下:

//找到自身的布局对象和添加到布局里widget的个数
QLayout *pLayout = ui->wgBackGround->layout();
int iCount = pLayout->count();

//计算布局控件的总高度
int iHeight = 0;
for (int i = 0; i < iCount; i++)
{
    QLayoutItem *pLayoutItem = (QLayoutItem *)pLayout->children().at(i);
    iHeight += pLayoutItem->widget()->height();
}

        正确的做法为直接对pLayout取Item,这样做取出来的对象跟你添加进pLayout的对象是相对应的.  addItem()取出来QLayoutItem,  addWidget()取出来QWidget,  addLayout()取出来QLayout;而我添加的只有widget所以在取出来后可以通过QLayoutItem转到widet直接获取高度,代码如下:

//找到自身的布局对象和添加到布局里widget的个数
QLayout *pLayout = ui->wgBackGround->layout();
int iCount = pLayout->count();

//计算布局控件的总高度
int iHeight = 0;
for (int i = 0; i < iCount; i++)
{
    QLayoutItem *pLayoutItem = (QLayoutItem *)pLayout->itemAt(i);
    iHeight += pLayoutItem->widget()->height();
}

 

你可能感兴趣的:(Qt)