Anzeige:
Ergebnis 1 bis 14 von 14

Thema: QPixmap und daufzeichnen

  1. #1
    Registrierter Benutzer
    Registriert seit
    30.12.2000
    Ort
    Bodensee, Überlingen
    Beiträge
    95

    QPixmap und daufzeichnen

    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

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ja, das ist nicht schwer. Ein QPixmap ist ein QPaintDevice.

    Code:
    // 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,
    _

  3. #3
    Registrierter Benutzer
    Registriert seit
    30.12.2000
    Ort
    Bodensee, Überlingen
    Beiträge
    95
    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

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _

  5. #5
    Registrierter Benutzer
    Registriert seit
    30.12.2000
    Ort
    Bodensee, Überlingen
    Beiträge
    95
    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

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.12.2000
    Ort
    Bodensee, Überlingen
    Beiträge
    95
    Vielen Dank fuer deine Hilfe! :-)

    Meine app wird immer besser... :-)

    Naja jetzt habe ich noch probleme mit automake usw..

    Gruss
    Jonas

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Eine KDE App?
    Automake Framework mit KDevelop erstellt?
    Oder mit dem kapptemplate?

    Ciao,
    _

  9. #9
    Registrierter Benutzer
    Registriert seit
    30.12.2000
    Ort
    Bodensee, Überlingen
    Beiträge
    95
    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

  10. #10
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    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?

    Code:
    	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

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Versuch mal explzit einen QPen zu setzen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Hab's jetzt so:

    Code:
    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

  13. #13
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, eigenartig.
    Das Bild selbst wird ja angezeigt oder?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  14. #14
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Zitat Zitat von anda_skoa
    Hmm, eigenartig.
    Das Bild selbst wird ja angezeigt oder?

    Ciao,
    _
    Ja.

    Gruß,
    Ace

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •