wie mache ich qcanvas transparent?

Alles rund um die Programmierung mit Qt
Antworten
moebius
Beiträge: 4
Registriert: 7. September 2004 23:25
Kontaktdaten:

wie mache ich qcanvas transparent?

Beitrag von moebius »

hi leute,

ich hätte da ein kleines problem...

ich habe in einem qcanvasview ein widget plaziert, welches live aufnahmen von einer firewire-kamera darstellt...jetzt würde ich gerne ein canvas erzeugen welches als "overlay" fungiert, damit der benutzer verschiedene dinge im bild markieren und verschieben kann (wie gesagt, das ganze markieren usw. spielt sich nur auf dem overlay ab, nicht im darunterliegenden widget!). wie bekomme ich es nun hin, dass das canvas-objekt transparent ist und über dem "livebild"-widget liegt? hat da von euch jemand ne idee???

vielen dank im voraus...
pm_Snake
Beiträge: 86
Registriert: 7. September 2004 11:33

Beitrag von pm_Snake »

mit ->visible( false );
kannst es unsichtbar machen glaub ich.
Allerdings wird es dein Problem nicht lösen.

Warum habt ihr eigentlich immer alle Videos und so in euren Widgets? Hab ich nen Trend verpasst? ^^
>>[-]>[-]>[-]>[-]<<<<<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]
moebius
Beiträge: 4
Registriert: 7. September 2004 23:25
Kontaktdaten:

Beitrag von moebius »

pm_Snake hat geschrieben:mit ->visible( false );
kannst es unsichtbar machen glaub ich.
Allerdings wird es dein Problem nicht lösen.
also einfach unsichbar machen bringt mir leider nichts, da ich ja die entsprechenden canvasitems sehen möchte... :)
pm_Snake hat geschrieben:Warum habt ihr eigentlich immer alle Videos und so in euren Widgets? Hab ich nen Trend verpasst? ^^
...die bildverarbeitungsbranche boomt... :D
pm_Snake
Beiträge: 86
Registriert: 7. September 2004 11:33

Beitrag von pm_Snake »

Die Frage ist ob es so funktioniert...
Evtl musst du doch alles im widget selber machen. OnClicked() beginnt dann praktisch die markierung ( ein rectangle, irgendeine farbe ) und OnReleased() beendet es. Bei OnMouseMove() ( die signals stimmen so nicht, nur zur verdeutlichung ) aktualisierst du das Rectangle vom Point wo geklickt wurde bis zu QCursor::pos() . Damit würde zumindest die Markierung hinhauen. Evtl kannst du dann den Inhalt dieses Rectangles in ein Pixmap, dann kann man es auch verschieben. Ich denke das ist ein ziemlich kompliziertes Thema wo jeder mit ner anderen Lösungsmöglichkeit kommt...
>>[-]>[-]>[-]>[-]<<<<<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Endlich mal was interessantes...

QCanvasView kann nur ein Canvas darstellen, soweit ich weiß. Du kannst dich also von dem Gedanken noch ein Canvas draufzulegen gleich verabschieden.

Frage: Wie stellst du denn dein Livebild in dem QCanvasView dar? Source code
Frage: Laüft denn die Darstellung des Videostreams flüssig?
Frage: Ist Zooming-Funktionalität angedacht?
Frage: Soll das Bild "gescrollt" werden?
moebius
Beiträge: 4
Registriert: 7. September 2004 23:25
Kontaktdaten:

Beitrag von moebius »

Endlich mal was interessantes...
danke... :)
QCanvasView kann nur ein Canvas darstellen, soweit ich weiß. Du kannst dich also von dem Gedanken noch ein Canvas draufzulegen gleich verabschieden.
ich kann auf den viewport von qcanvasview ein widget legen (über addChild()), in das ich mir über die winId ein natives win32fenster (bekomm ich aus einer anderen bibliothek geliefert) plaziere, in dem mein videostream dargestellt wird (kapiert?) :). das funktioniert soweit alles sauber! leider verdeckt mir mein widget mit dem stream mein canvas! dieses problem sollte ich wohl zuerst lösen...
Frage: Wie stellst du denn dein Livebild in dem QCanvasView dar? Source code
Frage: Laüft denn die Darstellung des Videostreams flüssig?
Frage: Ist Zooming-Funktionalität angedacht?
Frage: Soll das Bild "gescrollt" werden?
zu den fragen:

1. siehe oben.

hier mein code, den ich zum testen verwende...

Code: Alles auswählen

QCanvas* canvas = new QCanvas(640, 480);

QCanvasView* view = new QCanvasView(canvas,this);

QLabel* label = new QLabel(view->viewport());
	
((QScrollView*) view->viewport())->addChild(label);

label->setBackgroundColor(white);
label->setMinimumSize(640,480);
view->setMinimumSize(640,480);
label->show();

WId id =  label->winId();

view->show();

//-------------------------------------------------------------
//hier wird nun das native fenster in das label gelegt
//und der livestream gestartet!
//-------------------------------------------------------------
	
2. ja, da mein natives fenster das ganze übernimmt.
3. ja, einmal das native fenster (erschlag ich mit der anderen lib) und einmal mein canvas.
4. jupp...

ergo...alles läuft auf ein qcanvasview hinaus in dem ein transparentes canvas objekt über meinem win32 fenster liegt...

grüße,
moe
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

ok, dann mal los...

class QOverlayWidget : public QWidget
{
QOverlayWidget(standardkram)
{
setAutoMask(true);
}

protected:
virtual void updateMask()
{
QBitmap bm( size() );
bm.fill( color0 ); //transparent

QPainter paint;
paint.begin( &bm, this );

paint.setBrush( color1); // use non-transparent color
paint.setPen( color1);
paintControl(&paint);

paint.end();
setMask( bm );
}

void paintControl(QPainter * p)
{
hier die Darstellung
}
};

Anschließend fügst du das object der QOverlayWidget-Klasse mit addChild zu deinem QCanview hinzu. Bewegen kannste es mit moveChild()... Der Rest ist trivial. Sollte klappen....
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

über welche bibliothek kriegste denn das fenster-handle?
moebius
Beiträge: 4
Registriert: 7. September 2004 23:25
Kontaktdaten:

Beitrag von moebius »

also zunächst mal vielen dank für den code, werde ihn sofort ausprobieren...aber ich glaube, du hast mir gerade den umgekehrten fall geliefert...denn du machst mir mein widget transparent und nicht die "leinwand" (canvas), die darüber liegen soll...also nochmal...der "querschnitt" sieht folgendermaßen aus...

QCanvas (<- transparent)
-
QWidget (<- w32-fenster)
-
QCanvasView

aber ich denke, ich könnte dieses von dir beschriebene verfahren auch auf drawBackground von qcanvas anwenden, oder? indem ich den hintergrund von qcanvas mit einem transparenten brush ausfülle, müsste es doch funktionieren?!?!

naja, mal schauen...

zur frage bezüglich bibliothek...ich benutze die matrox imaging library. da hast du ein display, das sich in jedes objekt "einnisten" kann, das ein windows handle besitzt...die ganzen darstellungs-, update- und zeichenfunktionen übernimmt das display...

greetz...
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ne ne, es ist schon richtig. Nicht dein Widget wird transparent, sondern das Overlay. Deine QCanvasView-Klasse habe ich ja gar nicht angefasst.

Die Struktur ist dann:

deine QListView - liegt ganz "unten".
dann Overlay-Klassen als Kinder von QListView (addChild() )

so sind die Sachen völlig unabhängig voneinander.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Der Sourcecode stammt übrigens aus meinem Bildverarbeitungsprojekt, in dem genau die von dir beschriebenen Funktionalitäten realisiert sind... :)
Antworten