gpt4 book ai didi

c++ - Qt 的 BorderLayout 示例如何工作?

转载 作者:行者123 更新时间:2023-11-30 04:09:13 25 4
gpt4 key购买 nike

我正在尝试修改 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));
}

最佳答案

之前碰巧玩过demo。要回答你的问题,首先 setGeometry 只是为了计算出项目的高度,然后第二个 setGeometry() 将它放在布局的底部。当项目被放置在布局的南/底部时,你一开始不知道它有多高,对吧?

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

关于c++ - Qt 的 BorderLayout 示例如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21398607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com