0

配列の一部(ウィジェットでできている)を円の周りで動かす関数を作ろうとしています。ビルドして実行しますが、アイコンは表示されません。誰かが理由を教えてもらえますか?

これが.cppファイルの関数です

    void setIconWidgetLocation(iconWidget *w, float arcSize)
{
    int outerRadius = 100;
    int innerRadius = 60;
    int radius = (outerRadius + innerRadius)/2;
    arcSize = 2.0 * M_PI/ 5;

    iconWidget *icon[5];

    QSizeF size = w->size();
    QPointF center(size.width(),size.height());
    center /= 2.0;

    //Loop for finding the circles and moving them
    for(int i = 0; i<5; i++)
    {
        icon[i] = new iconWidget;

        //Finding the Icon center on the circle
        double x = center.x() + radius * sin(arcSize * i);
        double y = center.y() + radius * cos(arcSize * i);

        x -= 10/2;
        y -= 10/2;

        //moves icons into place
        icon[i]->move(x,y);

    }
}

これがヘッダーファイルです

#ifndef ZMENUWIDGET_H
#define ZMENUWIDGET_H
#include "iconwidget.h"

#include <QWidget>

class zMenuWidget : public QWidget
{
    Q_OBJECT

    iconWidget *icon[5];

public:
    explicit zMenuWidget(QWidget *parent = 0);

    void paintEvent(QPaintEvent *event);

    void resizeEvent(QResizeEvent *event);

signals:

public slots:

};

#endif // ZMENUWIDGET_H

これがsetIconWidgetLocationの呼び出しです。

#include "zmenuwidget.h"
#include <QPaintEvent>
#include <QResizeEvent>
#include <QPainter>
#include <QColor>
#include <QPainterPath>
#include <cmath>

setIconWidgetLocation(iconWidget *w, float arcSize);

zMenuWidget::zMenuWidget(QWidget *parent) :
    QWidget(parent)
{

}
4

1 に答える 1

1

実際に関数を呼び出すことはありません。あなたが示したのは関数宣言(別名プロトタイプ)です。関数が存在することをコンパイラに通知し、関数がどのように呼び出されるかを示すだけです。

私がそこに行く前に、あなたは最初に解決することがいくつかあります。つまり、パラメータは意味がありません。関数は、メニューのアイコンを作成してレイアウトします。したがって、を渡すことiconWidgetは混乱を招きます。また、パスしますarcSizeが、関数内で計算します。この関数は実際にはのメンバーである必要がありzMenuWidgetます。最後に、場所を設定するだけでなく、アイコンも作成するため、名前が誤解を招く可能性があります。

これらすべてのことを1回のヒットで解決しましょう。

void zMenuWidget::createAndLayoutIcons()
{
    int outerRadius = 100;
    int innerRadius = 60;
    int radius = (outerRadius + innerRadius)/2;
    double arcSize = 2.0 * M_PI/ 5;

    QSizeF size = w->size();
    QPointF center(size.width(),size.height());
    center /= 2.0;

    //Loop for finding the circles and moving them
    for(int i = 0; i<5; i++)
    {
        icon[i] = new iconWidget(this);

        //Finding the Icon center on the circle
        double x = center.x() + radius * sin(arcSize * i);
        double y = center.y() + radius * cos(arcSize * i);

        x -= 10/2;
        y -= 10/2;

        //moves icons into place
        icon[i]->move(x,y);
    }
}

クラスで定義されているため、この関数からローカルで定義されたicon配列を削除したことに注意してくださいzMenuWidget。これは、関数をクラスのメンバーにするために必要なもう1つのヒントです。

また、アイコン作成部分を変更して、メニューウィジェットのポインターを(親として)新しいアイコンウィジェットに渡すようにしました。iconWidgetが親ポインタを受け入れると仮定します。

        icon[i] = new iconWidget(this);

のコンストラクターでzMenuWidget、アイコンを作成します。

zMenuWidget::zMenuWidget( QWidget *parent)
    : QWidget(parent)
{
    createAndLayoutIcons(this);
}

それはあなたが正しい方向に動くようになるはずです。

于 2013-01-17T04:36:06.530 に答える