Qt的BorderLayout示例如何工作?

时间:2014-01-28 06:40:57

标签: c++ qt

我正在尝试修改borderlayout.cpp Example File。但是,在阅读代码时,我不明白以下几行是如何工作的:

item->setGeometry(QRect(item->geometry().x(),
    item->geometry().y(), rect.width(),
    item->sizeHint().height());

southHeight += item->geometry().height() + spacing();

item->setGeometry(QRect(rect.x(),
     rect.y() + rect.height() - southHeight + spacing(),
     item->geometry().width(),
     item->geometry().height()));

为什么setGeometry被调用两次?另外,item-> geometry()设置为什么/怎么设置(我知道它可能是由QLayout :: setGeometry(rect)设置的,但是查看QLayout的源代码,该函数所做的就是将rect分配给内部指针)?

完整的功能是:

void BorderLayout::setGeometry(const QRect &rect)
 {
     ItemWrapper *center = 0;
     int eastWidth = 0;
     int westWidth = 0;
     int northHeight = 0;
     int southHeight = 0;
     int centerHeight = 0;
     int i;

     QLayout::setGeometry(rect);

     for (i = 0; i < list.size(); ++i) {
         ItemWrapper *wrapper = list.at(i);
         QLayoutItem *item = wrapper->item;
         Position position = wrapper->position;

         if (position == North) {
             item->setGeometry(QRect(rect.x(), northHeight, rect.width(),
                                     item->sizeHint().height()));

             northHeight += item->geometry().height() + spacing();
         } else if (position == South) {
             item->setGeometry(QRect(item->geometry().x(),
                                     item->geometry().y(), rect.width(),
                                     item->sizeHint().height()));

             southHeight += item->geometry().height() + spacing();

             item->setGeometry(QRect(rect.x(),
                               rect.y() + rect.height() - southHeight + spacing(),
                               item->geometry().width(),
                               item->geometry().height()));
         } else if (position == Center) {
             center = wrapper;
         }
     }

     centerHeight = rect.height() - northHeight - southHeight;

     for (i = 0; i item;
         Position position = wrapper->position;

         if (position == West) {
             item->setGeometry(QRect(rect.x() + westWidth, northHeight,
                                     item->sizeHint().width(), centerHeight));

             westWidth += item->geometry().width() + spacing();
         } else if (position == East) {
             item->setGeometry(QRect(item->geometry().x(), item->geometry().y(),
                                     item->sizeHint().width(), centerHeight));

             eastWidth += item->geometry().width() + spacing();

             item->setGeometry(QRect(
                               rect.x() + rect.width() - eastWidth + spacing(),
                               northHeight, item->geometry().width(),
                               item->geometry().height()));
         }
     }

     if (center)
         center->item->setGeometry(QRect(westWidth, northHeight,
                                         rect.width() - eastWidth - westWidth,
                                         centerHeight));
 }

1 个答案:

答案 0 :(得分:2)

之前我碰巧玩过demo。要回答你的问题,首先设置Geometry来计算项目的高度,然后第二个setGeometry()将它放在布局的底部。 当项目放置在布局的南侧/底部时,您不知道它最初有多高,对吧?

这是GUI编程中的常规做法,例如,将字符串放在标签中,您将尝试将其放置在任何位置,只是为了计算高度和长度,然后分配正确的矩形,然后将字符串放入你想要的地方。