hab da ein merkwürdiges verhalten welches ich nicht nachvollziehen kann.
Hier mal ein kleines Video, was zeigt was ich meine.
http://www.youtube.com/watch?v=QY_srIYfFy0
Ich habe ein Widget abgeleitet von einem QGLWidget. Ein Timer ruft paintGL alle 10ms auf.
paintGL zeichnet mit QPainter den Hintergrund dann soll OpenGL Stuff kommen und zum schluss
wird die rote Linie wieder mit QPainter gezeichnet. Die Endposition wird von MouseMoveEvent in
2 Variablen abgelegt die von paintGL genutzt wird.
Meine Frage, wieso hängt das zeichnen so nach ?
Hier noch der Code
*.h
Code: Alles auswählen
#ifndef CADWIDGET_H
#define CADWIDGET_H
#include <QtCore>
#include <QtGui>
#include <QGLWidget>
class CADWidget : public QGLWidget
{
Q_OBJECT
public:
explicit CADWidget(QWidget *parent = 0);
virtual ~CADWidget();
protected:
void mouseMoveEvent(QMouseEvent *);
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
QLinearGradient linearGrad;
int mouse_x,mouse_y;
QTimer *timer;
private slots:
void onTimer();
};
#endif // CADWIDGET_H
Code: Alles auswählen
#include "cadwidget.h"
CADWidget::CADWidget(QWidget *parent) :
QGLWidget(parent),
linearGrad(QPointF(100, 100), QPointF(200, 200))
{
linearGrad.setColorAt(0, Qt::black);
linearGrad.setColorAt(1, Qt::white);
setMouseTracking(true);
timer = new QTimer(this);
timer->setInterval(1);
connect(timer,SIGNAL(timeout()),this,SLOT(onTimer()));
timer->start();
}
CADWidget::~CADWidget()
{
}
void CADWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_DEPTH_TEST | GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
}
void CADWidget::paintGL()
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
p.setPen(Qt::NoPen);
p.setBrush(linearGrad);
p.drawRect(0,0,width(),height());
/// OpenGl Stuff ///
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
GLfloat x = 3.0f * GLfloat(width()) / height();
glOrtho(-x, +x, -3.0f, +3.0f, 4.0f, 15.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
/// Zurück nach QPainter
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
/// QPainer Stuff ///
p.setPen(QColor(255,0,0));
p.drawLine(0,0,mouse_x,mouse_y);
swapBuffers();
}
void CADWidget::resizeGL(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/h,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CADWidget::mouseMoveEvent(QMouseEvent *e)
{
mouse_x = e->x();
mouse_y = e->y();
}
void CADWidget::onTimer()
{
paintGL();
}