PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT] QCanvasLine --> QCanvasPfeil



Wishmaster
06-08-2004, 12:05
Hallo zusammen,

ich habe folgendes Problem:

Ich habe eine QCanvasView auf der ich Kreise (Ellipsen) platzieren kann. Diese Kreise können über Linien verbunden werden. Zur Zeit mache ich das so, das die Linie jeweils vom Mittelpunkt der einen Ellipse zum Mittelpunkt der anderen geht, allerdings sollen diese Linien Uni- bzw. Bidirektionale Pfeile werden. Jetzt möchte ich allerdings das diese Pfeile exakt auf den Rand der Ellipse zeigen und nicht mehr auf die Mitte, hat jemand eine Idee, wie man das machen könnte (also den Pfeil und das er genau auf den Rand der Ellipse zeigt)

Vielen Dank schonmal für jeden Tip!

Bye,
Wishmaster

Boron
06-08-2004, 14:49
Haha, jetzt kommt die Mathematik ins Spiel.
Diverse Literatur zu "grafischen Algorithmen" sollten da recht hilfreich sein.
Eventuell ist das Zeug aus dem Mathe Grundkurs an einem Gymnasium schon ausreichend (ich das schon erfolgreich verdrängt :D).

Prinzip ist aber klar:

- Schnittpunkte der beiden Ellipsen mit dem Pfeil/Linie berechnen
- Linie nur von Schnittpunkt zu Schnittpunkt zeichnen

Wishmaster
06-08-2004, 16:58
Ja, sowas habe ich schon vermutet und bin bereits dabei mir etwas zusammenzubasteln, im Moment scheiterts noch an der Mathematik und das obwohl ich sämtliche Mathescheine an der Uni als auch Mathe im Abi (Leistungskurs) mit ordentlichen Noten bestanden habe! *schäm* :mad:

Naja, ich halt Euch über meine geistigen Ergüsse auf dem Laufenden!

Bye,
Wishmaster

Wishmaster
10-08-2004, 19:06
Das ist wirklich nicht mehr feierlich, ich schaffs doch tatsächlich nicht so ein paar dämliche Winkelberechnungen zu implementieren??!!

Das lustige ist, in bestimmten Positionen stimmt der Winkel, in anderen wiederum nicht.

Ne, ne, ne ....

Bye,
Wishmaster

Wishmaster
13-08-2004, 13:55
So, ich habe es endlich geschafft den Winkel bestimmen zu lassen, zurück also zu Qt:

Ich bräuchte jetzt praktisch eine neue Klasse (vllt. Abgeleitet von QCanvasLine?) in der geregelt wird wie die beiden zusätzlichen Linien pro Pfeil gezeichnet werden.

Wäre sehr nett wenn mir jemand ein kleines Beispiel nennen könnte!

Vielen Dank schonmal!

Bye,
Wishmaster

Wishmaster
15-08-2004, 00:00
Keiner? :(

Ok, ich habe mal einen Ansatz gebastelt:

qcanvasarrow.h:

#include <qcanvas.h>

class QCanvasArrow : public QCanvasItem
{
Q_OBJECT
public:
QCanvasArrow(QCanvas *canvas = 0);
void setPoints(int Ax, int Ay, int Bx, int By, bool bi);
void draw(QPainter *painter);
QRect boundingRect() const;
bool collidesWith(const QCanvasItem *other) const;

private:
QCanvasLine *line;
QCanvasLine *startLeft;
QCanvasLine *startRight;
QCanvasLine *endLeft;
QCanvasLine *endRight;
};

qcanvasarrow.cpp:

#include "qcanvasarrow.h"

QCanvasArrow::QCanvasArrow(QCanvas *canvas)
: QCanvasItem(canvas)
{
line = new QCanvasLine(canvas);

}

void QCanvasArrow::setPoints(int Ax, int Ay, int Bx, int By, bool bi)
{

}

void QCanvasArrow::draw(QPainter *painter)
{

}

bool QCanvasArrow::collidesWith(const QCanvasItem *other)
{
return true;
}

So, da kommt dann folgende Meldung:

g++ -c -pipe -Wall -W -O2 -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include -o main.o main.cpp
main.cpp: In function `int main(int, char**)':
main.cpp:16: error: cannot allocate an object of type `QCanvasArrow'
main.cpp:16: error: because the following virtual functions are abstract:
/usr/qt/3/include/qcanvas.h:126: error: virtual void
QCanvasItem::draw(QPainter&)
/usr/qt/3/include/qcanvas.h:197: error: virtual bool
QCanvasItem::collidesWith(const QCanvasSprite*, const QCanvasPolygonalItem*,
const QCanvasRectangle*, const QCanvasEllipse*, const QCanvasText*) const
main.cpp:16: Warnung: unused variable `QCanvasArrow*arrow'
make: *** [main.o] Fehler 1

Würde mich sehr freuen, wenn mir jemand weiterhelfen kann!

Bye,
Wishmaster

Boron
15-08-2004, 02:49
QCanvasItem::draw( QPainter&) ist richtig (siehe Qt API Doku) du hast einen QPainter*.

Was mit collidesWith( ...) nicht stimmt erkenne ich jetzt nicht.

Wishmaster
15-08-2004, 03:25
Ah, danke genau das wars! Danke!

Ich habe jetzt statt QCanvasItem gleich QCanvasLine genommen und drawShape überschrieben, scheint bisher zu klappen!

Bye,
Wishmaster

study_99
01-06-2005, 17:52
Ich würde mich für Deine Klasse QCanvasArrow interessieren. Besteht die Möglichkeit dass Du mir die irgendwie zukommen lässt?

Gruß
Study