Polygon::contains Point + MouseKlickEvent????[gelöst]

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Polygon::contains Point + MouseKlickEvent????[gelöst]

Beitrag von Qt-nator »

Hi,

mein vorhaben besteh darin in einem Widget in dem mehrere Polygone gezeichnet sind durch klicken auf eines der Polygone desen Farbe zu ändern.

Mein Problem ist nur das ich das MouseEvent nicht wirklich mit dem contains Point zusammen kriegen.

Code: Alles auswählen


void
ParameterToolWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
	KlickPunkt.setX(event->pos().x());

	KlickPunkt.setY(event->pos().y());	

	QString sMouseInteraction = "Maustaste wurde doppelt geklickt.";

	emit si_mousePosition(sMouseInteraction);

	if(polygon.containsPoint(KlickPunkt,Qt::WindingFill))
	{
	QMessageBox::information( this, "Info", Test);
	}
	
}
Ja das mein Ansatz nur leider Passiert beim doppelklicken dann überhauptnichts... wo ja die MSG-Box kommen soll.

Wäre dankbar für Ratschläge.

Qt-nator
Zuletzt geändert von Qt-nator am 18. März 2008 10:02, insgesamt 2-mal geändert.
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Re: Polygon::contains Point + MouseKlickEvent????

Beitrag von neuschi »

Qt-nator hat geschrieben: mein vorhaben besteh darin in einem Widget in dem mehrere Polygone gezeichnet sind durch klicken auf eines der Widgets desen Farbe zu ändern.
Erkläre das mal etwas genauer. Wenn ich mir nämlich deinen Code ansehe scheinst du nur ein Polygon zu behandeln. Und wieso "eines der Widgets"?!
Irgendwie werde ich nicht ganz schlau daraus.

Code: Alles auswählen

void
ParameterToolWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
	KlickPunkt.setX(event->pos().x());

	KlickPunkt.setY(event->pos().y());	

	if(polygon.containsPoint(KlickPunkt,Qt::WindingFill))
	{
	QMessageBox::information( this, "Info", Test);
	}
}
Und warum hier der "KlickPunkt"?! event->pos() ist doch schon ein QPoint.

\Ralf
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

hups hab mich verschrieben ... sollte heisen durch klicken die farbe eines der Polygone zu ändern. (ändere ich dann gleich noch)

polygon.containsPoint(KlickPunkt,Qt::WindingFill) <-- benötigt einen QPoint da kann ich nicht einfach

event->pos().x()

event->pos().y()

reinschreiben jedenfalls krieg ich dann fehlermeldung.

Also hab ein Widget mit Polygonen drin will auf ein Polygon klicken dann solls sich umfärben (für den anfang eine MSG-Box)
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

Qt-nator hat geschrieben:
polygon.containsPoint(KlickPunkt,Qt::WindingFill) <-- benötigt einen QPoint da kann ich nicht einfach

event->pos().x()

event->pos().y()
reinschreiben jedenfalls krieg ich dann fehlermeldung.
Wie wäre es mit

Code: Alles auswählen

polygon.containsPoint( event->pos() ,Qt::WindingFill)
Hast du auch mal OddEvenFillRule probiert?
Mach einfach mal an der Stelle folgendes:
qDebug() << polygon;
qDebug() << event->pos();

Wenn du unter Windows bist und nicht im Visual Studio, dann solltest du noch die console in der *.pro Datei aktivieren.
Schick dann mal die Ausgabe rüber.

\Ralf
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ausserdem kann es sein dass das Koordinatensystem nicht passt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Also ich arbeite mit Visual studio... und kompilieren tut er ja ordendlich.

Code: Alles auswählen

polygon.containsPoint( event->pos() ,Qt::WindingFill)
ist natürlich war ... garnicht bedacht, dass das auch geht.


OddEvenFillRule hab ich probiert bringt nichts.

Und das Koordinatensystem müsste stimmen da ich mir ja die Positionen anzeigen lassen kann und sie da ja stimmen.
Wenn du unter Windows bist und nicht im Visual Studio, dann solltest du noch die console in der *.pro Datei aktivieren.
Schick dann mal die Ausgabe rüber.
Versteh ich nicht? wie soll ich das machen? (Hab ich noch nie gemacht sorry)
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag von neuschi »

Qt-nator hat geschrieben:
Wenn du unter Windows bist und nicht im Visual Studio, dann solltest du noch die console in der *.pro Datei aktivieren.
Schick dann mal die Ausgabe rüber.
Versteh ich nicht? wie soll ich das machen? (Hab ich noch nie gemacht sorry)
in deine *.pro-Datei folgendes reinschreiben:

CONFIG += console

Dann geht auch unter Windows ein Shell-Fenster auf, in dem die Ausgaben erscheinen.
Aber da du unter Visual Studio arbeitest, musst du dort einfach nur ins "Output" Tab gucken.

Wenn du also in deinen Code folgendes reinschreibst:

Code: Alles auswählen

 qDebug() << polygon;
 qDebug() << event->pos();
dann sollte im Output-Tab ähnliches wie das hier erscheinen:

Code: Alles auswählen

QPolygon(QPoint(100,100) QPoint(34,23) )
QPoint(33,83)
Und das poste bitte mal hier.

\Ralf
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Morgen,

also ich hab kein *.pro file ... aber den Code hab ich eingefügt und raus kommt dann dabei:

QPolygonF<>
QPoint<73,247>
QPolygonF<>
QPoint<73,156>

Je nach dem wo ich Klicke.

Wohl bemerkt das kommt egal ob ein Polygon im Widget vorhanden ist oder nicht.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann wäre es mal an der Zeit das Polygon auch mit Informationen zu befüllen, denn wie du siehst ist es leer...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Morgen,

wie soll ich das verstehn???

Das ist meine Funktion um die Polygone zu zeichnen:

Code: Alles auswählen


ParameterToolWidget::DrawPolygon(double dgrad1, double dgrad2, double dR, double dR2, int nR, int nG, int nB)
{

	QPainter painter(this);

	painter.setPen(Qt::NoPen);

	painter.setBrush(QColor(nR,nG,nB));

	painter.setRenderHint(QPainter::Antialiasing, true);

	QPolygonF polygon;

	for (int nDeg=dgrad1; nDeg<=dgrad2; nDeg+=5)
	{
		polygon.push_back( QPointF( dWidth / 2. + dR * cos_d(nDeg), 
																dHeight / 2. + dR * sin_d(nDeg) ) );
	}

	for (int nDeg=dgrad2; nDeg>=dgrad1; nDeg-=5)
	{
		polygon.push_back( QPointF( dWidth / 2. + dR2 * cos_d(nDeg), 
																dHeight / 2. + dR2 * sin_d(nDeg) ) );
	}

Enthält das Polygon dann keine Informationen? Weil es ist ja mit der Farbe gefühlt die ich angegeben hab?

Gruß

Qt-nator
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

C++ Basics - was ist eine Member-Variable und was eine lokale Definition?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Verstehe jetzt nicht was das mit meinem Problem zu tun hat. Weil was ich gepostet hab Funktioniert ja!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du erzeugst eine lokale Variable polygon
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Ja schon. Nur wenn ich die Variable polygon im Header als public erzeuge, dann krieg ich wenn ich mir meine Polygone zeichnen lasse Probleme.

1. Die Polygone werden nicht mehr richtig Farblich gefüllt.
2. Der Rechner wird zu sehr belastet und das Programm lagt.

Da ist jetzt die Frage ob es sinnvoll ist polygon puplic zu machen?
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

So das Prinzip Problem ist gelöst.

Danke für die Hilfe.

Für das Detaliertere Problem muss ich mir noch überlegen wie ichs erklären kann. Werde ichs hier mal Posten, oder ich überwinde es selber.
Antworten