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

Creating a function to place child widgets

本文关键字:函数 一个 创建      更新时间:2023-10-16

我正在研究一个项目,该项目需要将多个实例放置在特定区域内。我有麻烦创建一个函数,将为我这样做。现在我必须手动设置每个实例的值。我该如何创建一个函数来获取所有实例并根据半径将它们均匀地放置在一个圆中呢?

这里是我手动设置位置的代码区域。函数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;

每个圆都需要一个圆心和半径。现在你只需要决定从哪里开始。角度0通常位于右侧(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);
}
相关文章: