Hi,
I have written a simple program that (try to:-)) draws a simple triangle on a PainterDevice. The drawing occurs in a paintEvent() routine but I get the following errors at runtime:
1) a message like "painter can only be initialized as a response to a paintEvent". Ok but my paintings are indeed in the paintEvent() routine, so what?
2) another message "painter is not active" BUT if I add a this->painter.begin(this) I get a message "painter is already active".
What is important is that nothing is drawn, which is my problem now.
A last question: how can I draw that spline with Qt4???
Could anybody help?
Thanks in advance.
Below is my code (can send the complete archive if necessary).


///////////////////////////////////////////////////////////////////////////////
// File : vadSpline.h //
///////////////////////////////////////////////////////////////////////////////


#ifndef _VAD_SPLINE_H
#define _VAD_SPLINE_H

#include <vadVisualization.h>

#define XSIZE 400
#define YSIZE 400

/** vadSpline est un exemple de classe pour la visualisation d'informations
dans le projet de VAD, qui implemente le dessin d'une spline.
*/
class vadSpline : public vadVisualization
{
Q_OBJECT

public:
vadSpline(QAbstractItemModel *model, vad *app=NULL, QWidget *parent=NULL, int xsize=XSIZE, int ysize=YSIZE, char *name=NULL, int debug=0);

protected slots:
void paintEvent(QPaintEvent *e);

private:
QPolygon polygon;
};

#endif

///////////////////////////////////////////////////////////////////////////////
// File : vadSpline.cxx //
///////////////////////////////////////////////////////////////////////////////


#include "vadSpline.h"

vadSpline::vadSpline(QAbstractItemModel *model, vad *app, QWidget *parent, int xsize, int ysize, char *name, int debug)
: vadVisualization(model, app, parent, xsize, ysize, name, debug)
{
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysO ff);
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff );
this->show();
}

void
vadSpline:aintEvent(QPaintEvent *event)
{
this->polygon.setPoints(3,
this->model()->data(this->model()->index(0, 0)).toInt(),
this->model()->data(this->model()->index(0, 1)).toInt(),
this->model()->data(this->model()->index(1, 0)).toInt(),
this->model()->data(this->model()->index(1, 1)).toInt(),
this->model()->data(this->model()->index(2, 0)).toInt(),
this->model()->data(this->model()->index(2, 1)).toInt()
);
printf("painter active ? %d\n", this->painter->isActive() ? 1 : 0);
this->painter->setWindow(0, 0, 100, 100);
this->painter->drawPolygon(this->polygon);
}




///////////////////////////////////////////////////////////////////////////////
// File : vadVisualization.h //
///////////////////////////////////////////////////////////////////////////////


#ifndef _VAD_VISUALIZATION_H
#define _VAD_VISUALIZATION_H

#include <qabstractitemview.h>
#include <qpainter.h>
#include <visCore.h>
//#include "vad.h"

#define SIZE 400

//class vad;
#define vad QApplication

/** vadVisualization est la classe generique pour la visualisation
d'informations dans le projet de VAD.
Le principe retenu est celui du mapping de variables sur 1, 2 ou 3
axes. Ces axes ne sont pas obligatoirement les axes d'un repère nD
classique et chaque sous-classe est libre d'utiliser ce mapping a
sa facon, y compris de ne pas l'utiliser si ce n'est pas approprie.
L'objectif etait de factoriser ici certaines fonctionnalites communes
a la plupart des techniques de visualisation d'information, afin
d'asssurer coherence et gain de temps pour les developpeurs.
L'affectation des variables aux axes est effectuee par les methodes
SetXdimension(), SetYdimension() et SetZdimension().
*/
class vadVisualization : public QAbstractItemView, public visCore
{
Q_OBJECT

public:
vadVisualization(QAbstractItemModel *model, vad *app=NULL, QWidget *parent=NULL, int xsize=SIZE, int ysize=SIZE, char *name=NULL, int debug=0);

/// Acces a l'application.
visGetMacro(Vad, vad *);

protected:
/// Les fonctions ci-dessous sont des pures virtuelles, qu'il est donc necessaire de definir.
/// Pour l'instant leur definition est plus que sommaire, en fait uniquement dans le but de passer la compilation.
/// Voir la doc de Qt pour les definitions.
QRect visualRect(const QModelIndex &index) const {
return QRect(0, 0, this->width(), this->height());
}
void scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint=QAbstractItemView::EnsureVisible) {};
QModelIndex indexAt(const QPoint&) const {
return QModelIndex();
};
QModelIndex moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers) {
return QModelIndex();
};
int horizontalOffset() const {return 0;};
int verticalOffset() const {return 0;};
bool isIndexHidden(const QModelIndex &index) const {return FALSE;};
void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags flags) {};
QRegion visualRegionForSelection(const QItemSelection &selection) const {
return QRect(0, 0, this->width(), this->height());
};

/// Un painter pour le dessin.
QPainter *painter;
};

#endif


///////////////////////////////////////////////////////////////////////////////
// File : vadVisualization.cxx //
///////////////////////////////////////////////////////////////////////////////


#include "vadVisualization.h"

#define SUBFRAMEMARGIN 2

vadVisualization::vadVisualization(QAbstractItemMo del *model, vad *app, QWidget *parent, int xsize, int ysize, char *name, int debug)
: QAbstractItemView(parent)
{
this->setModel(model);
this->SetDebug(debug);
// la taille est determinee par l'application au sein de laquelle la visualisation s'insere
// sinon sa taille est determinee par les parametres d'initialisation
// this->Trace("1 size : %d %d", this->width(), this->height());
// if (app == NULL)
this->QWidget::setFixedSize(QSize(xsize, ysize));
// else
// app->Register(this);
// this->Trace("2 size : %d %d", this->width(), this->height());
// le style des fenetres
this->setFrameStyle(QFrame::Raised | QFrame::Panel);
this->setLineWidth(SUBFRAMEMARGIN);
// this->SetVad(app);
// this->Trace("3 size : %d %d", this->width(), this->height());
this->painter = new QPainter(this);
}