PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QPixmap und daufzeichnen



jonasge
01-06-2002, 11:19
Hallo,
ich versuche gerade C++ in verbindung mit QT zu programmieren.
In meiner Header-Datei definiere ich ein QPixmap mini_icon;
Im C-.Programm mache ich dann das:
mini_icon = SmallIcon("mini_icon.png");

Danach kann ich ja das QPixmap ganz normal setzten:
this->setPixmap(mini_icon);
Dies verwende ich in verbindung mit KSystemTray, das ist mein Icon unten
bei der Uhr. Das geht auch alles!! :-)

Doch gibt es eine Funktion, das man auf das bestehende Image mini_icon
z.B. noch zwei Zahlen und das %-Zeichen draufmalt und das dann mit
this.>setPixmap(mini_iconver): malt????

Waere nett wenn mir jemand ein Beispiel zeigt...

Gruss
Jonas

anda_skoa
01-06-2002, 13:21
Ja, das ist nicht schwer. Ein QPixmap ist ein QPaintDevice.



// eine Kopie anlegen
QPixmap pixmap(mini_icon);

// Painter erzeugen
QPainter painter(pixmap);

// x und y Koordinate berechnen.
QFontMetrics fm(font());
QString text;
text.sprintf("%d %%", zahl);
QSize textSize = fm.size(text);
// linkes unteres Eck IIRC
int x = (pixmap.width() / 2) - (textSize.width() / 2);
int y = (pixmap.height() / 2) + textSize.height() / 2);

// Text auf das pixmap malen
painter.drawText(x, y, text);


Nicht getestet, aber so ähnlich sollte es gehen.

Ciao,
_

jonasge
01-06-2002, 14:11
Also das geht nicht ganz so.
Er mekert an den Zeilen:
QPainter painter(pixmap);
QSize textSize = fm.size(text)
Das ist die Ausgabe vom g ++:
-builtin -c kacpi.cc
kacpi.cc: In method `void kacpi::slotupdate()':
kacpi.cc:375: no matching function for call to `QPainter::QPainter (QPixmap &)'
/usr/include/qt/qpainter.h:61: candidates are: QPainter::QPainter()
/usr/include/qt/qpainter.h:62: QPainter::QPainter(const QPaintDe
vice *)
/usr/include/qt/qpainter.h:63: QPainter::QPainter(const QPaintDe
vice *, const QWidget *)
/usr/include/qt/qpainter.h:372: QPainter::QPainter(const QPainte
r &)
kacpi.cc:380: no matching function for call to `QFontMetrics::size (QString &)'
/usr/include/qt/qfontmetrics.h:81: candidates are: class QSize QFontMetrics::siz
e(int, const QString &, int = -1, int = 0, int * = 0, char ** = 0) const
make: *** [kacpi.o] Error 1

Noch was:
Wenn dann das draufgeschrieben ist, liegt das ja im painter, doch den muss ich doch wieder zu einem Qpixmap konvertieren,
das ich den mit ksdock->setPixmap(pixmap); zeichnen kann oder?

Gruss
Jonas

anda_skoa
01-06-2002, 15:03
Original geschrieben von jonasge

kacpi.cc:375: no matching function for call to `QPainter::QPainter (QPixmap &)'
/usr/include/qt/qpainter.h:61: candidates are: QPainter::QPainter()
/usr/include/qt/qpainter.h:62: QPainter::QPainter(const QPaintDe
vice *)
/usr/include/qt/qpainter.h:63: QPainter::QPainter(const QPaintDe
vice *, const QWidget *)
/usr/include/qt/qpainter.h:372: QPainter::QPainter(const QPainte
r &)


Ja, mein Fehler.
es muß heißen:
QPainter painter(&pixmap);

Man braucht einen Pointer auf ein QPaintDevice.



kacpi.cc:380: no matching function for call to `QFontMetrics::size (QString &)'
/usr/include/qt/qfontmetrics.h:81: candidates are: class QSize QFontMetrics::siz
e(int, const QString &, int = -1, int = 0, int * = 0, char ** = 0) const
make: *** [kacpi.o] Error 1


Ah, hab ich auch übersehen.
Probier es mit 0 als ersten Parameter, oder benutze fm.boundingRect(text);



Noch was:
Wenn dann das draufgeschrieben ist, liegt das ja im painter, doch den muss ich doch wieder zu einem Qpixmap konvertieren,
das ich den mit ksdock->setPixmap(pixmap); zeichnen kann oder?


Nein, der Painter zeichnet in/auf das Paintdevice.
Da das Paintdevice in diesem Fall das Pixmap ist, zeichnet er direkt dorthin.
Möglicherweise wrden die Änderungen est gemacht, wenn der QPainter zuerstört wird.

Dann machst du das Zeichnen entweder in einer eigenen Methode oder:
QPainter painter;
painter.begin(&pixmap)

// zeichnen

painter.end();

Ciao,
_

jonasge
01-06-2002, 15:18
nochmal Hi,
danke fuer deinen ansto?. :-)
Ich habe jetzt nochmal in die QT-Doc geschaut, und anhand deines Beispiel
mit Docu das programmiert:
QPainter paint( &icon);
paint.setPen(white);
paint.setFont(QFont("system", 10));
paint.drawText( X, X,X,X, AligenCenter, "94,3 %"); // noch keine Variable zum Test.
erase();
ksdock->setPixmap(icon);

So das geht auch, ich sehe irgendwas wei?es vor meinem Bild.

Doch mit den Angaben bei paint.drawText( X,X,X,X, AligenCenter, "94,3"); habe ich probleme.
Was soll das erste X ?
Was soll das zweite X ?
Was soll das dritte X ?
Was soll das vierte X ?
bzw. Welche bedeutung habe die Zahlen??

Gruss
Jonas

anda_skoa
01-06-2002, 15:30
Das hängt davon ab, welche drawtext Methode du benutzt.

Verwende einfach die, die nur x und y Parameter vor dem QString hat.

Die, die du da hast, ist die komlizierteste ;)

Die Parameter sind laut Qt Doku:
x X Koorindate des Textes
y Y Koordinate des textes
w Breite des Textes (engl. width)
h Höhe des Textes
flags Qt::AlignmentFlags und Qt::TextFlags mir OR verknüpft
dann der String
dann die Länge des Strings in Anzahl der Zeichen, -1 für den ganzen String.
dann ein Pointer of ein QRect, das von drawText mit dem boundingRect des Textes gefüllt wird.
und schließlich ein interner Parameter.

Wie schon gesagt, ich würde vorschlagen, am Anfang eine weniger komplizierte Methode zu benutzen :)

Ciao,
_

jonasge
01-06-2002, 22:24
Vielen Dank fuer deine Hilfe! :-)

Meine app wird immer besser... :-)

Naja jetzt habe ich noch probleme mit automake usw..

Gruss
Jonas:D

anda_skoa
02-06-2002, 12:23
Eine KDE App?
Automake Framework mit KDevelop erstellt?
Oder mit dem kapptemplate?

Ciao,
_

jonasge
02-06-2002, 13:57
Ja eine KDE app.
Benuetze kapptemplate, aber jetzt geht es.
Ich habe bei meiner app ein paar icons gebraucht, und die musste ich ins Makefile.am adden, das hat erst nicht geklappt, doch jetzt geht es !


Gruss
Jonas;)

AceTheFace
30-03-2005, 20:17
Also ich will gerade das gleiche machen, allerdings will der keinen Text auf meine PixMap malen. Es erscheint nur das geladene Bild. Jemand ne Idee?



QPixmap img;
QString text;

img.resize(400,300);
img.load("/home/hanf/Documents/ehre.png");
QPainter p(&img);
QFont font( "times", 24 );
p.setFont(font);
int x = (img.width() / 2);
int y = (img.height() / 2);
text = "haaaaalllooo aaaaaallleeeeexxxxxxx";
p.drawText(x,y,text);
p.end();
imgLabel->setAutoResize(true);
imgLabel->setPixmap(img);

Gruß,
Ace

anda_skoa
30-03-2005, 20:58
Versuch mal explzit einen QPen zu setzen.

Ciao,
_

AceTheFace
31-03-2005, 00:56
Hab's jetzt so:



QPixmap img;
QString text;
QPainter p;
QPen pen(red,3);
img.resize(400,300);
img.load("/home/hanf/Documents/ehre.png");
p.begin(&img);
int x = (img.width() / 2);
int y = (img.height() / 2);
text = "haaaaalllooo aaaaaallleeeeexxxxxxx";
p.setPen(pen);
p.drawText(x,y,text);
p.end();
imgLabel->setAutoResize(true);
imgLabel->setPixmap(img);

Brachte leider keine Veränderung.

Gruß,
Ace

anda_skoa
31-03-2005, 12:07
Hmm, eigenartig.
Das Bild selbst wird ja angezeigt oder?

Ciao,
_

AceTheFace
31-03-2005, 12:11
Hmm, eigenartig.
Das Bild selbst wird ja angezeigt oder?

Ciao,
_

Ja.

Gruß,
Ace