2016-08-21 2 views
0

mit erhalte ich folgende Fehler:QWidget :: repaint: rekursive repaint erkannt Zeiger

QWidget::repaint: Recursive repaint detected.

QPainter::begin: A paint device can only be painted by one painter at a` time.
QPainter::beginNativePainting: Painter not active.
QPainter::setRenderHint: Painter must be active to set rendering hints.
QPainter::translate: Painter not active.

void Graficador::paintEvent(QPaintEvent *event){ 

QPainter painter; 

painter.begin(this); 
painter.beginNativePainting(); 
painter.setRenderHint(QPainter::Antialiasing); 
painter.translate(250, 250); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClearColor(0.2,0.4,0.3,1); 
    glClear(GL_COLOR_BUFFER_BIT); 

std::vector<unsigned short> nodosaux; 
glPushMatrix(); 
for (unsigned i=1;i<=automata->Dimension();i++) 
{ 
    nodosaux=(automata->operator [](i))->Nodos(); 

    if((automata->operator [](i))->Estado()==0) 

     glColor3f(0.3,0.3,0.3); 

       else if((automata->operator [](i))->Estado()==1.0) 

         glColor3f(1.0,1.0,1.0); 

        else if((automata->operator [](i))->Estado()==2.0) 

          glColor3f(0.7,0.7,0.7); 

     glBegin(GL_POLYGON); 

      for(unsigned j=1;j<=nodosaux.size();j++) 
       { 
        glVertex2f(automata->Nodo(nodosaux[j-1]).first, 
           automata->Nodo(nodosaux[j-1]).second); 

       } 

     glEnd(); 

     glColor3f(0.0,0.0,0.0); 

     glBegin(GL_LINE_LOOP); 

     for(unsigned j=1;j<=nodosaux.size();j++) 
      { 
       glVertex2f(automata->Nodo(nodosaux[j-1]).first, 
          automata->Nodo(nodosaux[j-1]).second); 

      } 

     glEnd(); 
     } 


glPopMatrix(); 

    glPushMatrix(); 

    glColor3f(1.0f,1.0f,1.0f); 
    glBegin(GL_LINES); 

     glVertex2f(-500.0,0.0); 
     glVertex2f(500.0,0.0); 
     glVertex2f(0.0,-500.0); 
     glVertex2f(0.0,500.0); 



    glEnd(); 

    glPopMatrix(); 

    painter.endNativePainting(); 

    painter.end(); 


} 

(Sorry für die Verwendung des Operators, ich weiß, dass es nicht der richtige Gebrauch, aber ich muss löse dieses Problem zuerst).

Dies ist das paintEvent() eines QGLWidget. Ich hatte kein Problem, bis ich anfing, einen Zeiger meiner Klasse "Automaten" zu benutzen. Diese Klasse hat nur einige Vektoren mit den Koordinaten (x, y) der Ecken, also habe ich keine Ahnung, warum ich dieses Problem habe.

Das komplette Programm hat eine große Klasse System, das innen hat: eine Benutzerschnittstelle, ein Automat und einige andere Klassen, die für andere Aufgaben verwendet werden. Die Benutzeroberfläche enthält dieses QGLWidget und die Automaten, die ich hier verwenden möchte, sind Zeiger, die auf die Automaten in der Systemklasse verweisen.

Ich geben diesen Zeiger wie folgt aus:

void Cargar_automata(Automata_Celular* ac) 
{ 
automata = new Automata_Celular(); 
automata =ac; 
} 

Ich habe einige andere Widgets, aber sie sind nur die Tasten Dateien und Timer zu verwalten.

+0

Ihre Funktion aufgerufen Cargar_automata hat einen Speicherverlust. Die Linienautomaten = neu Automata_Celular(); ist nicht erforderlich, da der Automatenzeiger durch die Zuordnung automata = ac in der nächsten Zeile geplottert wird. –

Antwort

1

Wenn Sie ein OpenGL-Widget in Qt verwenden, sollten alle Bilder in einem Member namens paintGL() erstellt werden. Sie verwenden das paintEvent, das die Fehlermeldungen verursacht, die Sie sehen.

So sollte der Code wie folgt aussehen:

void Graficador::paintGL(){ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glClearColor(0.2,0.4,0.3,1); 
    glClear(GL_COLOR_BUFFER_BIT); 

std::vector<unsigned short> nodosaux; 
glPushMatrix(); 
for (unsigned i=1;i<=automata->Dimension();i++) 
{ 
    nodosaux=(automata->operator [](i))->Nodos(); 

    if((automata->operator [](i))->Estado()==0) 

     glColor3f(0.3,0.3,0.3); 

       else if((automata->operator [](i))->Estado()==1.0) 

         glColor3f(1.0,1.0,1.0); 

        else if((automata->operator [](i))->Estado()==2.0) 

          glColor3f(0.7,0.7,0.7); 

     glBegin(GL_POLYGON); 

      for(unsigned j=1;j<=nodosaux.size();j++) 
       { 
        glVertex2f(automata->Nodo(nodosaux[j-1]).first, 
           automata->Nodo(nodosaux[j-1]).second); 

       } 

     glEnd(); 

     glColor3f(0.0,0.0,0.0); 

     glBegin(GL_LINE_LOOP); 

     for(unsigned j=1;j<=nodosaux.size();j++) 
      { 
       glVertex2f(automata->Nodo(nodosaux[j-1]).first, 
          automata->Nodo(nodosaux[j-1]).second); 

      } 

     glEnd(); 
     } 


glPopMatrix(); 

    glPushMatrix(); 

    glColor3f(1.0f,1.0f,1.0f); 
    glBegin(GL_LINES); 

     glVertex2f(-500.0,0.0); 
     glVertex2f(500.0,0.0); 
     glVertex2f(0.0,-500.0); 
     glVertex2f(0.0,500.0); 



    glEnd(); 

    glPopMatrix(); 
} 
+0

Danke für die Antwort @Peter. Fast jeder Fehler ist jetzt weg, aber ich habe immer noch den Fehler: "QWidget :: Repaint: Rekursives Repaint erkannt". – Sarhiix