-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 画家(这个);您在 main 中使用 this 指针。this 指针用于对象的成员函数。您的 main 函数没有要使用的 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]

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

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

还有其他事情,就像代码中的注释中所说的那样,您只需将指向设备的指针传递给QPainter构造函数。它可以是 a QWidget、 aQPixmap或 a QImage

也许你应该先读一下:http ://www.cplusplus.com/doc/tutorial/classes/

于 2013-08-17T21:06:11.210 回答
1

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

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

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

于 2013-08-17T20:18:31.650 回答