gpt4 book ai didi

c++ - 创建一个函数来放置子部件

转载 作者:行者123 更新时间:2023-11-28 07:48:33 24 4
gpt4 key购买 nike

我正在从事一个需要将多个实例放置在特定区域内的项目。我在创建一个可以为我做这件事的函数时遇到了麻烦。现在我必须手动设置每个实例的值。我将如何制作一个函数来获取所有实例并将它们均匀地放置在基于半径的圆圈中?

这是我手动设置展示位置的代码区域。函数 setIconWidgetLocation 是我目前拥有的,只是不知道在里面放什么。

zMenuWidget::zMenuWidget(QWidget *parent) :
QWidget(parent)
{
icon1 = new iconWidget(this);
icon2 = new iconWidget(this);
}

void zMenuWidget::resizeEvent(QResizeEvent *event)
{
int yEndPosition = 0;
int outerRadius = 100;
int innerRadius = 60;

QSizeF size = event->size();
QPointF center(size.width(),size.height());
center /= 2.0;

yEndPosition = (outerRadius - innerRadius)/2.0 + innerRadius;
yEndPosition = center.y() - yEndPosition;

int yCurrIconLoc = icon1->rect().center().y();
int xCurrIconLoc = icon1->rect().center().x();

icon1->move(center.x() - xCurrIconLoc, yEndPosition - yCurrIconLoc);
}

void setIconWidgetLocation(iconWidget* w, float angle)
{

}

最佳答案

我相当确定这正是 QLayout 的用途。您可以从中派生自己的类,并使用它来径向布局其小部件。

但是只是继续你现在拥有的东西,忘了......你只想要简单的放置。您将需要遍历所有图标。大概您已将它们存储在一个数组中。

为此,您需要知道圆的半径,这似乎是硬编码的。您可能想要的是将图标中心对齐在圆上,因此您需要从外半径中减去图标大小的一半。但我看到你有外半径和内半径。所以让我们把图标中心放在中间:

int radius = (outerRadius + innerRadius) / 2;

而您真正在这里做的只是数学。圈子很容易。您决定每个图标所对应的弧度。这取决于你。您可能会计算它以使图标不会发生冲突,或者您可能会使其保持不变,或者您可能会均匀地间隔图标。

但您似乎想要均匀间隔的图标,所以这很容易。每个图标占据饼图的一部分,以弧度表示 Tau,传统上称为 2Pi

float arcSize = 2.0 * M_PI / numIcons;

每个圆都需要一个圆心和一个半径。现在您只需要决定从哪里开始。角度零通常在右侧(水平偏移 radius ,垂直偏移为零),但您可能希望它位于顶部。我们可以添加四分之一转 (Tau/4),也可以只翻转数学。

通常圆的公式是:

x = cx + r * cos(angle);
y = cy - r * sin(angle); // Assuming screen co-ordinates

但如果我想从顶部开始(仍然逆时针旋转),我会这样做:

x = cx - r * sin(angle);   // Flip the minus sign if you want clockwise.
y = cy - r * cos(angle);

现在剩下要做的就是找到所有图标的中心并定位它们:

for( int i = 0; i < numIcons; i++ )
{
// Find icon centre on circle
double x = centreX + radius * sin(arcSize * i);
double y = centreY - radius * cos(arcSize * i);

// Offset to get the top-left of your icon
x -= iconWidth / 2;
y -= iconHeight / 2;

// And position it with your Qt call, whatever that may be.
icon[i]->move(x, y);
}

关于c++ - 创建一个函数来放置子部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14331065/

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