[QPainter].drawLine im Vordergrund darstellen

Alles rund um die Programmierung mit Qt
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

[QPainter].drawLine im Vordergrund darstellen

Beitrag 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)
Zuletzt geändert von Neuling_ am 29. Januar 2010 14:07, insgesamt 1-mal geändert.
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Hat inzwischen jemand eine Idee?

Beitrag von Neuling_ »

Hat inzwischen jemand eine Idee?
Qt 2009.05
Entw.-umgebung Qt-Creator
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Zeig bitte code. Wie malst du über die ui-Elemente? Den Konstruktor "QPainter(QPen)" kenn ich nicht...
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag 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
Qt 2009.05
Entw.-umgebung Qt-Creator
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Beschreib lieber mal was du eigentlich vor hast.
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag 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
Qt 2009.05
Entw.-umgebung Qt-Creator
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag 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ß
Qt 2009.05
Entw.-umgebung Qt-Creator
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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.
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag 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.
Qt 2009.05
Entw.-umgebung Qt-Creator
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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 ^^.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
JoseMan
Beiträge: 121
Registriert: 4. März 2009 18:09

Beitrag 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---
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag 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 ;)
Qt 2009.05
Entw.-umgebung Qt-Creator
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag 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
Zuletzt geändert von -=Freaky=- am 24. August 2009 13:23, insgesamt 1-mal geändert.
Antworten