在非成员中使用'this'无效

时间:2013-08-17 20:04:30

标签: c++ this qpainter

我有一个问题 - 之前已经讨论了很多,但我看到的所有解决方案都不起作用。 这段代码有什么问题?

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 个答案:

答案 0 :(得分:4)

在函数“main”中,您使用保留关键字“this”,表示“当前对象的地址”。 main是一个函数,而不是任何具有“this”变量的类或对象的成员。我对qt一无所知但google告诉我“QPainter”需要QPaintDevice的地址,但是5秒钟。

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

答案 1 :(得分:2)

如果你在谈论QPainter画家(这);你在main中使用this指针。 this指针用于对象的成员函数。你的main函数没有这个指针可供使用。

答案 2 :(得分:1)

在Qt中,您需要先创建一个窗口(继承自QWidget),然后才能在屏幕上看到任何内容。然后,在窗口的QPainter方法中创建一个paintEvent对象,然后您将有适当的this传递给QPainter构造函数。

强烈建议您遵循一些教程。 Qt很棒,但它很庞大,它不是一个库,而是一个框架(就像大多数其他GUI一样)。

您的代码必须以非常具体的方式构建。

答案 3 :(得分: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();
}

在这里你可以看到class MyWidget的函数paintEvent中我们使用了this指针。我们可以因为我们在类的非静态成员中使用它。此处this的类型为MyWidget*

看看标准:

  

9.3.2此指针[class.this]

     

在非静态成员函数的主体中,关键字this是一个prvalue表达式,其值是调用该函数的对象的地址。类X的成员函数中的类型是X *。

所以你不能在this函数中使用main指针,这没有意义。

另外,就像在代码中的注释中所说的那样,你只需要将一个设备指针传递给QPainter构造函数。它可以是QWidgetQPixmapQImage

也许你应该从头开始阅读:http://www.cplusplus.com/doc/tutorial/classes/