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.
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. –