Seite 1 von 1

CAD Anwendung - Fadenkreuz und Rasterpunkte

Verfasst: 27. Dezember 2009 21:31
von griffin27
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

Verfasst: 28. Dezember 2009 07:31
von upsala
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.

Verfasst: 1. Januar 2010 23:31
von griffin27
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:

Code: Alles auswählen

	setCacheMode(QGraphicsItem::DeviceCoordinateCache, QSize(rect.width(),rect.height()));
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:

Code: Alles auswählen

...
	if (scene()->views()[0]->matrix().m11() * spacing() < MIN_GRID_SPACING)
		return;
...
lg, Karl

Verfasst: 3. Januar 2010 19:39
von upsala
Da du deine Punkte wahrscheinlich mit 2-For-Schleifen erstellst, kannst du dort am meisten optimieren, wenn du deine Punkte nur für den sichtbaren Bereich an Qt übergibst.