MausMoveEvnet zu langsam ??

Alles rund um die Programmierung mit Qt
Antworten
AndOne
Beiträge: 10
Registriert: 19. März 2011 20:57

MausMoveEvnet zu langsam ??

Beitrag von AndOne »

Hallo Leutz,

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
*.cpp

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();
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MausMoveEvnet zu langsam ??

Beitrag von franzf »

1) um ne ktualisierung anzustoßen, nimm bitte updateGL() (Folge den Links in der Doku von updateGL weg, dnn weißt du warum).
2) Statt dasUpdate mit dem Timer anzustoßen, wäre ein direktes updateGL() am Ende von mouseMoveEvent() nicht schlecht.
AndOne
Beiträge: 10
Registriert: 19. März 2011 20:57

Re: MausMoveEvnet zu langsam ??

Beitrag von AndOne »

Danke erstmal,

hab das mal so umgesetzt, aber leider genau der selbe Effekt.

Mfg AO
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: MausMoveEvnet zu langsam ??

Beitrag von franzf »

Leider hab ich so gut wie keine Ahnung (eigentlich gar keine :oops: ) von OpenGL, auch nicht von der Qt-Integration.

Schau dir mal das Overpainting-Example an (Doku danach befragen). Da steht auch einiges dabei, speziell zu der paintEvent-Implementierung. Eine andere (bessere?) Lösung wäre natürlich, wenn du die Linie auch mit OpenGL malen würdest. Und den BG-Gradient evtl. auch. Aber da kann dir sicher jemand mit OpenGL-Kenntnissen mehr helfen :(
AndOne
Beiträge: 10
Registriert: 19. März 2011 20:57

Re: MausMoveEvnet zu langsam ??

Beitrag von AndOne »

kein Problem franz,

ich habe auch schon darüber nach gedacht das Zeichnen komplett in OpenGL zu realisieren. Aber liegt es wirklich daran oder an einem trägen Event. Mit QPainter ist es doch um einiges leichter, zu mal ja QPainter in kombi mit QGLWidget auch schneller sein soll da dieser wohl mit OpenGL Zeichnet. Das heisst wieder ein Branch in "git" und probieren. Aber als Programmierer kennt man das ja :mrgreen:

MfG thorsten
Antworten