-8

問題があります - 以前に何度も議論しましたが、私が見たすべての解決策はここでは機能しません。このコードのどこが間違っていますか?

main.cpp:8:19: error: invalid use of ‘this’ in non-member function

#include <QApplication>
#include <QPainter>
#include <math.h>
class QPainter;

int main(int argc, char *argv[]){
  QApplication app(argc,argv);

  QPainter painter(this);
  painter.setPen(QPen(Qt::black,3));

  int n=8;
  for (int i=0;i<n;++i){
    qreal fAngle=2*3.14*i/n;
    qreal x = 50 + cos(fAngle)*40;
    qreal y = 50 + sin(fAngle)*40;
    painter.drawPoint(QPointF(x,y));
  }


  return app.exec();    
}
4

4 に答える 4

4

関数「main」では、「現在のオブジェクトのアドレス」を意味する予約キーワード「this」を使用しています。main は関数であり、「this」変数を持つクラスまたはオブジェクトのメンバーではありません。私はqtについて何も知りませんが、Googleで5秒すると、「QPainter」がQPaintDeviceのアドレスを必要としていることがわかります。

http://qt-project.org/doc/qt-5.0/qtgui/qpainter.html#QPainter

于 2013-08-17T20:46:52.430 に答える
2

あなたがQPainterペインター(これ)について話しているなら。メインで this ポインターを使用しています。this ポインターは、オブジェクトのメンバー関数用です。メイン関数には、使用する this ポインターがありません。

于 2013-08-17T20:09:26.160 に答える
1

何が起こっているのかを理解せずにコードをコピーしようとしました。

次のようなコードを見たようです:

#include <QtGui>
#include <QWidget>
 
class MyWidget : public QWidget
{
    Q_OBJECT
public:
 
protected:
    void paintEvent(QPaintEvent *event)
    {
        //create a QPainter and pass a pointer to the device.
        //A paint device can be a QWidget, a QPixmap or a QImage
        QPainter painter(this);   // <- Look at this !!
        //               ^^^^ Allowed    

        // ...
    }

signals:

public slots:
 
};
 
int main( int argc, char **argv )
{
    QApplication app( argc, argv );
 
    MyWidget myWidget;
    myWidget.show();
 
    return app.exec();
}

ここで、関数 paintEvent でポインタclass MyWidgetを使用していることがわかります。thisクラスの非静的メンバーで使用するためです。これthisは のタイプMyWidget*です。

標準を見てください:

9.3.2 this ポインタ [class.this]

非静的メンバー functionの本体では、キーワードthisは、関数が呼び出されるオブジェクトのアドレスを値とする prvalue 式です。クラス X のメンバー関数での this の型は X* です。

したがって、関数this内でポインターを使用することはできません。これは意味がありません。main

その他、コード内のコメントにあるように、デバイスへのポインターをQPainterコンストラクターに渡すだけです。、QWidgetQPixmapまたは のいずれかQImageです。

多分あなたはこれを最初に読むべきです: http://www.cplusplus.com/doc/tutorial/classes/

于 2013-08-17T21:06:11.210 に答える
1

QtQWidgetでは、画面に何かを表示する前に (から継承して) ウィンドウを作成する必要があります。QPainter次に、ウィンドウのメソッド内にオブジェクトを作成すると、コンストラクターpaintEventに適切thisに渡すことができます。QPainter

いくつかのチュートリアルに従うことを強くお勧めします。Qt は素晴らしいですが、巨大であり、ライブラリではなくフレームワークです (他のほとんどの GUI と同様)。

コードは非常に具体的な方法で構造化する必要があります。

于 2013-08-17T20:18:31.650 に答える