wie mache ich qcanvas transparent?
wie mache ich qcanvas transparent?
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...
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...
also einfach unsichbar machen bringt mir leider nichts, da ich ja die entsprechenden canvasitems sehen möchte...pm_Snake hat geschrieben:mit ->visible( false );
kannst es unsichtbar machen glaub ich.
Allerdings wird es dein Problem nicht lösen.
...die bildverarbeitungsbranche boomt...pm_Snake hat geschrieben:Warum habt ihr eigentlich immer alle Videos und so in euren Widgets? Hab ich nen Trend verpasst? ^^
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...
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...
>>[-]>[-]>[-]>[-]<<<<<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]
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?
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?
danke...Endlich mal was interessantes...
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...QCanvasView kann nur ein Canvas darstellen, soweit ich weiß. Du kannst dich also von dem Gedanken noch ein Canvas draufzulegen gleich verabschieden.
zu den fragen: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?
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!
//-------------------------------------------------------------
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
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....
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....
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...
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...
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.
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.