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

Posted

技术标签:

【中文标题】创建一个函数来放置子小部件【英文标题】:Creating a function to place child widgets 【发布时间】:2013-01-15 04:13:19 【问题描述】:

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

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



【问题讨论】:

【参考方案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);

【讨论】:

那么我该如何将它放在上面的代码中呢?我对此还比较陌生,所以我需要朝着正确的方向前进。 所以所有这些都将进入“setIconWidgetLocation”函数? 是的,差不多... 很明显,您的菜单需要跟踪所有图标。我已经提供了基本的想法。让它发挥作用取决于你。 =)

以上是关于创建一个函数来放置子小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中正确重用 Provider

如何将小部件放置在具有成比例大小和位置的小部件上方

Kivy 布局高度以适应子小部件的高度

缓存子小部件与重新创建它们

如何从 Flutter 中的子小部件调用父小部件功能

Gtk3用另一个小部件替换子小部件