Seite 1 von 2

[QPainter].drawLine im Vordergrund darstellen

Verfasst: 10. August 2009 07:22
von Neuling_
Hallo,

kann mir jemand sagen wie ich die Ebene von Widgets oder eben meiner "Linie" im Quellcode verändern kann?
Ich habe ein Bild, auf dass ich die Linie legen wollte, ich erstelle die Linie im Quellcode mit QPainter(QPen), beim debuggen wird die Linie aber hinter das (über die .ui eingefügte) Bild (QLabel) gelegt.

Nochmal Klartext:
:arrow: Wie kann ich die mit .drawLine erstellte Linie über meinem QLabel anzeigen lassen?

Kann mir jemand weiterhelfen.
Danke.

Gruß,
Neuling

PS: bitte meldet euch


Edit: Seite 2 ist aktuell (29.01.2010)

Hat inzwischen jemand eine Idee?

Verfasst: 20. August 2009 11:04
von Neuling_
Hat inzwischen jemand eine Idee?

Verfasst: 20. August 2009 11:18
von franzf
Zeig bitte code. Wie malst du über die ui-Elemente? Den Konstruktor "QPainter(QPen)" kenn ich nicht...

Verfasst: 21. August 2009 12:26
von Neuling_

Code: Alles auswählen

QPainter Line(this);
QPen chPen(Qt::red, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
Line.setPen(chPen);

Line.drawLine( 1PosX, 1PosY, 2PosX, 2PosY);

ich suche soetwas wie.

Strich.ImmerGANZVorne = true;
^^


Danke schonmal für die Rückmeldung

Verfasst: 21. August 2009 18:02
von upsala
Beschreib lieber mal was du eigentlich vor hast.

Verfasst: 24. August 2009 07:35
von Neuling_
hä?

ich erstelle einen Strich mit QPainter x; x.drawLine
Der Strich soll immer im Vodergrund dargestellt werden.
Wenn ich ein Bild (mit QLabel) auf meine Form setze ist der Strich noch abundzu im Hintergrund (hab da kein Verhaltensmuster feststellen können, wann die Linie vor oder hinter dem Bild ist).

immernoch unverständlich? xD

Verfasst: 24. August 2009 08:36
von solarix
Grundsätzlich werden die Widgets ja einfach in der Z-Order gerendert. Ein widget kann mittels "widget->raise()" zur Front geschubst werden (das macht uic jedenfalls bei einem "Push to Front" im Designer).

Also: dein Widget, welches im "paintEvent(..)" die Linie zeichnet, muss einfach (nachdem alle anderen Widgets erstellt wurden) mit einem "raise()" nach vorne gebracht werden.

hth...

Verfasst: 24. August 2009 10:24
von Neuling_
vielen Dank!
Wenn es so funktioniert wie du es beschrieben hast, ist das genau das, was ich gesucht habe.
Blos müsste ich dann ja den Strich zum Widget machen, damit ich die Funktion überhaupt benutzen kann.

Code: Alles auswählen

QPainter a(this);
QPen chPen(Qt::red, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
 a.setPen(chPen);
a.drawLine(231,213,631,631);
a.raise()  // gibt es so nicht
Muss ich etwas includen?
Mit meinem QImage geht es auch nicht.

Gruß

Verfasst: 24. August 2009 10:56
von solarix
Blos müsste ich dann ja den Strich zum Widget machen, damit ich die Funktion überhaupt benutzen kann.
selbstveraendlich... wenn du den Code bisher im parent (paintEvent()) hattest, geht das natuerlich nicht. Du musst daraus ein eigenes Widget ("MyLineWidget" oder so) machen und dieses dann mit (raise()) ueber die anderen legen.

Verfasst: 24. August 2009 11:59
von Neuling_
hm, jo bin noch nicht so fit, sri
ich blick das mit dem paintEvent noch nicht so ganz.

Kann ich im paintEvent kein Widget erstellen?
Also rein theoretisch!
Wär ja blöd bei jedem aufruf des paintEvents ein Widget zu erstellen.

Kann ich das Widget dann in der Main so erstellen?

Code: Alles auswählen

QPainter a(this);
QPen chPen(Qt::red, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
a.setPen(chPen);
a neuesA;

//neuesA = Widget?
Kann das bitte jemand geradebiegen, bei mir funktionierts nämlich nicht.
Insgesammt fehlt mir der Übergang von QImage, QPainter, Q... zu Widget.
Bräuchte da ein kleines Beispiel, wird ja immer recht gleich sein.

Verfasst: 24. August 2009 12:14
von JoseMan
z.B. so:

Code: Alles auswählen

class MyLineWidget : public QWidget
{
 MyLineWidget(QWidget *parent=0);
 draw(int x1,int y1,int x2,int y2,QPainter& painter);
}


MyLineWidget ::MyLineWidget (QWidget *parent)
:QWidget(parent)
{}
MyLineWidget ::draw(int x1,int y1,int x2,int y2,QPainter& painter)
{
 painter.draw(x1,y1,x2,y2);
}
und dann im paintEvent:

Code: Alles auswählen

 QPainter painter(this);
 // zeichne dies...
 // zeichne das...
 MyLineWidget line(this)
 line.draw(x1,y1,x2,y2,painter);
 line.raise()
Hoffentlich habe ich keinen Patzer gemacht ^^.

Verfasst: 24. August 2009 12:19
von solarix
Bräuchte da ein kleines Beispiel
http://doc.trolltech.com/4.5/widgets-analogclock.html

[EDIT]
@Neuling_: Halte dich an das obige Beispiel (clock) der Trolls.. nicht das von JoseMan... das ist kein sauberes OOP und tut auch nicht das,was du möchtest..

Verfasst: 24. August 2009 12:28
von JoseMan
solarix hat geschrieben: [EDIT]
@Neuling_: .. nicht das von JoseMan... das ist kein sauberes OOP und tut auch nicht das,was du möchtest..
Mh, warum ist das nicht sauber und warum tut es das nicht?

Ciao J---

Verfasst: 24. August 2009 12:31
von Neuling_
wie doof von mir, dass ich da noch nicht drauf gekommen bin.

Danke für eure Gedult, ich werde vermutlich noch etwas for "clock" brauchen^^


doch..
Heut ist nicht alle Tage, ich komme wieder keine Frage ;)

Verfasst: 24. August 2009 12:57
von -=Freaky=-
du koenntest einfach ein eigenes widget ueber das komplette parent widget legen und darauf rummalen, in event() dann alle events bis auf die paint events weiterleiten ans parent widget und im konstruktor einmal setAttribute( Qt::WA_TransparentForMouseEvents ) aufrufen.

ggf. im resizeEvent vom parent noch immer die groesse deines "drawing layers" entspr. anpassen.

dann kannst du im ganzen parent widget auf oberster ebene rummalen wie du willst und trotzdem mit maus/tastatur noch die elemente darunter (buttons, edits, ....) bedienen.

das habe ich irgendwann mal so ausprobiert und es klappte problemlos und ist ziemlich einfach.

mfg,
julian