0

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

这是我手动设置位置的代码区域。功能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)
{

}
4

1 回答 1

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);
}
于 2013-01-15T04:24:46.770 回答