2013-01-15 101 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

相關問題