2013-01-15 41 views
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) 
{ 

} 

回答

1

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

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

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

int radius = (outerRadius + innerRadius)/2; 

而你真正在这里做的只是数学。圈子很容易。您可以决定每个图标的圆弧角度。这取决于你。您可以计算它以便图标不会相互碰撞,也可以使其保持不变,或者您可以均匀地放置图标。

但是你似乎想要均匀间隔的图标,这很容易。每个图标占据一片馅饼,其弧度为Tau,更传统上称为2Pi

float arcSize = 2.0 * M_PI/numIcons; 

每个圆需要一个中心和一个半径。现在你只需要决定从哪里开始。零角度通常在右侧(水平偏移radius,垂直偏移0),但您可能希望它位于顶部。我们可以添加四分之一圈(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); 
} 
+0

那么我会如何把它放在上面的代码中?我对此仍然比较陌生,所以我需要朝着正确的方向前进。 – zachstarnes

+0

类似的东西...... – paddy

+0

所以所有这些都会在“setIconWidgetLocation”函数中进行吗? – zachstarnes

相关问题