Hallo liebe Qt-Gemeinde,
ich bin noch relativ blutiger Anfänger in Sachen Qt und C++.
Bin grad dabei, dass ich meine ersten Schritte in Richtung CAD-Software wage.
Ich arbeite mit Qt 2009.3 (4.5.2).
Leider bin ich mit der Performance überhaupt nicht zufrieden.
Mein Programm malt derzeit ein Hintergrund Punkte-Raster, darüber ein Fadenkreuz.
Selbst ohne Grafikelemente an sich ist das Fadenkreuz schon sehr lahm über den Raster-Punkten. Sind die Rasterpunkte weg, ist auch das Fadenkreuz relativ schnell.
Ein paar Hintergründe:
Stuktur: QMainWindow - QGraphicsView - QScene
Fadenkreuz und Raster sind als QGraphicsItem implementiert
In QGraphicsView wird der Slot mouseMoveEvent zum Updaten der Fadenkreuzposition verwendet.
Was kann ich machen, damit das Fadenkreuz möglichst agil ist?
Auf das Raster möchte ich nicht verzichen müssen.
Das Raster ist derzeit A4-Format in mm groß (Scene-Koordinaten) mit einem Abstand von 2mm. D.h. ca. 15000 Punkte.
Soll ich das Grid vielleich in ein Bild zeichnen, und immer nur das Bild anzeigen? Da kenn ich mich jedoch noch nicht so aus.
Wie kann man das ganze schneller machen?
Ein "Problem" hab ich auch noch: Nach dem Starten der EXE-Datei muss ich mit dem Cursor ca. 10s lang hin- und herfahren, bis das Fadenkreuz angemessen schnell reagiert. In dieser Zwischenzeit hat es eine Updaterate von ca. einmal pro Sekunde.
Hab ich da vielleicht einen Fehler im Programm?
Wenn ihr Code-Ausschnitte braucht, bitte einfach sagen.
Schöne Feiertage wünsch ich ncoh.
lg, Karl
CAD Anwendung - Fadenkreuz und Rasterpunkte
CAD Anwendung - Fadenkreuz und Rasterpunkte
- Dateianhänge
-
- Screenshot
- 20091222.png (23.23 KiB) 2361 mal betrachtet
Auf dem Screenshot sind keine 15000-Punkte zu sehen. Zeichnest du event. immer alle 15000-Punkte, obwohl sie nicht sichtbar sind? Außerdem würde ich die Darstellung der Punkte abschalten, wenn die Skalierung zu klein wird.
Mal davon abgesehen, würde ich die Punkte mit drawBackground zeichnen, da das Grid ja auch außerhalb deines A4-Blattes wirkt.
Mal davon abgesehen, würde ich die Punkte mit drawBackground zeichnen, da das Grid ja auch außerhalb deines A4-Blattes wirkt.
Hallo,
danke für deine Hinweise.
Gezeichnet werden tatsächlich immer alle Punkte. Aber ich glaube, dass Qt das doch managed, dass nur die betroffenen Punkte gezeichnet werden, oder?
Ich hab jetzt noch viel herumprobiert. Auch drawBackground, aber das war noch langsamer.
Schlussendlich hat mir der Befehl:
geholfen. Nun werden die Rasterpunkte wirklich schnell gezeichnet, und das Fadenkreuz folgt dem Cuser angenehm schnell.
Das mit dem ausblenden des Grids bei kleinem Zoom-Faktor ist eine gute Idee.
Hab ich gleich umgesetzt:
in der paint-methode:
lg, Karl
danke für deine Hinweise.
Gezeichnet werden tatsächlich immer alle Punkte. Aber ich glaube, dass Qt das doch managed, dass nur die betroffenen Punkte gezeichnet werden, oder?
Ich hab jetzt noch viel herumprobiert. Auch drawBackground, aber das war noch langsamer.
Schlussendlich hat mir der Befehl:
Code: Alles auswählen
setCacheMode(QGraphicsItem::DeviceCoordinateCache, QSize(rect.width(),rect.height()));
Das mit dem ausblenden des Grids bei kleinem Zoom-Faktor ist eine gute Idee.
Hab ich gleich umgesetzt:
in der paint-methode:
Code: Alles auswählen
...
if (scene()->views()[0]->matrix().m11() * spacing() < MIN_GRID_SPACING)
return;
...