durchsichtige fenster

Alles rund um die Programmierung mit Qt
Antworten
qt fan
Beiträge: 53
Registriert: 28. Dezember 2007 21:41

durchsichtige fenster

Beitrag von qt fan »

hallo,
ich hab heute versucht mein fenster innen dursichtig zu machen, also dass man gerade den desktop dahinter sieht.
das ist mir so gelungen:
this->setAttribute(Qt::WA_NoSystemBackground); setAutoFillBackground ( 1 );

jetzt besteht leider das problem, dass beim ersten paint event (welches ja von dem aufruf von setattribute nur verzoegert wird) der inhalt vom fenster geloescht wird und dann schwarz erscheint.
wenn das fenster irgendwohin gezogen wird aktualisiert sich auch nicht der inhalt vom fenster und man sieht halt darin den orginalen desktopausschnitt.

wird im assistant auch beschrieben.
Qt::WA_NoSystemBackground:
Indicates that the widget has no background, i.e. when the widget receives paint events, the background is not automatically repainted. Note: Unlike WA_OpaquePaintEvent, newly exposed areas are never filled with the background (e.g after showing a window for the first time the user can see "through" it until the application processes the paint events). Setting this flag implicitly disables double buffering for the widget. This is set/cleared by the widget's author.

eigl haette ich gerne dass ebend der fensterhintergrund gerade das ist, was man hinter dem fenster sehen wuerde. hat jemand eine loesung?
setwindowopacity ist natuerlich toll, aber das laesst mich ebend kein nichttransparentes widget in das fenster setzen.

mfg qt fan
edit: setmask kenne ich auch schon, aber es trotzdem noch faelle welche nicht abdeckt sind.
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

auch auf die Gefahr hin, dass ich jetzt was falsches meine...
swiw sind trabsparente Fenster nciht so einfach moeglich, zum. unter Linux ohne COmposite-Manaher nicht, sonst wuerde die Konsole (KDE 3.5) ja nicht einfach den Hintergrund "abfotografieren" und dann reinsetzen... wobei da auch nur dashintergrundbild sichtbar ist, weil der X-Server ja nicht weiss was hinter den Fenstern liegt
qt fan
Beiträge: 53
Registriert: 28. Dezember 2007 21:41

Beitrag von qt fan »

ok hab mir gedacht das vlt mal versuchen zu proggen, ebend mit einem snapshot des desktops. einziger makel daran ist dass wenn das prog den fokus wiederbekommt bekommt muss es minimieren um dann nen snapshot zu machen, das entgeht dem anwender natuerlich nicht.
aber ansonste sollte das ja moeglich sein und schick waere es allemal :D. wollte halt mal wissen ob es vlt schon soetwas gibt fuer qt.

mfg qt fan
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

naja, die Konsole udn verschiedene Superkaramba-Widgets minimieren sich ja auch nciht, um den hintergrund aufzunehmen, vielleicht wirst du mit einer Suche in den Superkaramba-Quellen oder denen der aktuellen 3.5er Konsole fuendig.
¤dit: unter windows: http://www.qtwiki.de/wiki/ARGB_Widgets_unter_Windows
qt fan
Beiträge: 53
Registriert: 28. Dezember 2007 21:41

Beitrag von qt fan »

hallo, bevor ich jetzt den artikel naeher anschaue. will ich mal meinen code praesentieren. es ruckelt zwar ein wenig beim verschieben des fensters aber vlt laesst sich das noch aendern.

Code: Alles auswählen

haeder
#ifndef QCAPWIDGET_H_
#define QCAPWIDGET_H_
#include<QWidget>
class qcapwidget:public QWidget{
	Q_OBJECT
public:
	qcapwidget(QWidget *parent=0);
protected:
	void moveEvent(QMoveEvent *e);
	void focusInEvent(QFocusEvent * e) ;
	void paintEvent(QPaintEvent *e);
private:
	QPixmap *pm; 
	QPoint *point;
	QRect *r;
};
#endif /*QCAPWIDGET_H_*/

Code: Alles auswählen

source
#include<QtGui>
#include"qcapwidget.h"
#include"templates.h"
qcapwidget::qcapwidget(QWidget *parent):pm(new QPixmap),point(new QPoint),r(new QRect){
	*pm=QPixmap::grabWindow(QApplication::desktop()->winId());
	setFocusPolicy(Qt::ClickFocus);
}
void qcapwidget::moveEvent(QMoveEvent *e){
	*point=e->pos();
	update();
}
void qcapwidget::focusInEvent(QFocusEvent *e){
	_("focusevent")
	hide();
	*pm=QPixmap::grabWindow(QApplication::desktop()->winId());
	show();
	move(*point);
	update();
}
void qcapwidget::paintEvent(QPaintEvent *e){
	QPainter painter(this);
	r->setTopLeft(*point);
	r->setSize(size());
	QPixmap pmtemp=pm->copy(*r);
	painter.drawPixmap(0,0,pmtemp);
	
}
mein problem ist jetzt hier, dass focusInEvent nicht aufgerufen wird. _("...") ist uebrigens ein cout macro. im assistant steht man soll nur ebend setFocuspolicy aufrufen dafuer. geht aber trotzdem nicht.
weiss jemand einen rat? erfahrungsgemaess verbringt man mit solchen hindernissen stunden wenn man selbst nicht die ahnung hat.

mfg qt fan
xchrisx
Beiträge: 18
Registriert: 23. August 2007 20:20
Wohnort: Duisburg
Kontaktdaten:

Beitrag von xchrisx »

nen kollege von mir hat das mal verwendet:
http://www.kde-look.org/content/show.php?content=13969
ev suchst du sowas ja.
qt fan
Beiträge: 53
Registriert: 28. Dezember 2007 21:41

Beitrag von qt fan »

so:

Code: Alles auswählen

#ifndef QCAPWIDGET_H_
#define QCAPWIDGET_H_
#include<QWidget>
class qcapwidget:public QWidget{
public:
	qcapwidget(QWidget *parent=0, Qt::WindowFlags f = 0);
protected:
	void moveEvent(QMoveEvent *e);
	void paintEvent(QPaintEvent *e);
	void focusInEvent(QFocusEvent *e);
	void focusOutEvent(QFocusEvent *e);
private:
	QPixmap pm; 
	QPoint point;
	QRect r;
	bool b;
};
#endif /*QCAPWIDGET_H_*/

Code: Alles auswählen

#include<QtGui>
#include <windows.h>
using namespace std;
#include"qcapwidget.h"
#include"templates.h"
qcapwidget::qcapwidget(QWidget *parent, Qt::WindowFlags f):QWidget(parent,f){
	pm=QPixmap::grabWindow(QApplication::desktop()->winId());
	//setAttribute(Qt::WA_OpaquePaintEvent);
	setFocusPolicy(Qt::StrongFocus);
}
void qcapwidget::moveEvent(QMoveEvent *e) {
	point=e->pos();
	update();
}
void qcapwidget::focusOutEvent(QFocusEvent *e) {
	_("out")
	b=0;
}
void qcapwidget::focusInEvent(QFocusEvent *e) {
	if (b==0) {
		hide();
		Sleep(100);
		pm=QPixmap::grabWindow(QApplication::desktop()->winId());
		Sleep(100);
		show();
	}
	b=1;
}
void qcapwidget::paintEvent(QPaintEvent *e) {
	QPainter painter(this);
	r.setTopLeft(point);
	r.setSize(size());
	QPixmap pmtemp=pm.copy(r);
	painter.drawPixmap(0, 0, pmtemp);

}
weiter komme ich leider nicht, funktioniert aber schon ganz praechtig, bis auf die focus events. das klappt nicht immer.
mfg qt fan
Dateianhänge
shapedclock.PNG
shapedclock.PNG (14.43 KiB) 4005 mal betrachtet
Antworten