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水平方向のオフセットと垂直方向のゼロのオフセット) が、おそらく上にしたいでしょう。4 分の 1 回転 ( 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 に答える