我正在开发一个项目,需要将多个实例放在特定区域内。我无法创建一个能够为我完成此功能的功能。现在我必须手动设置每个实例的值。我将如何制作一个能够拍摄所有实例并根据半径将它们均匀地放在圆圈中的函数?
以下是我手动设置展示位置的代码区域。函数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)
{
}
答案 0 :(得分:1)
我很确定这正是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);
}