QIcon zeichnen

Alles rund um die Programmierung mit Qt
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

QIcon zeichnen

Beitrag von Nvidia »

Warum wird das icon nicht gezeicht? IcoGroesse ist in echt 512x512px

Code: Alles auswählen

    QIcon icon;
    QPainter *painter = new QPainter();
    painter->drawPixmap(0,0,QPixmap(":/Icons/ArrowUp.png"));
    icon.paint(painter,0,0,512,512);
    action->setIcon(icon);
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Gibts das Icon überhaupt und was soll das Ganze? QIcon Doku lesen sollte helfen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ja das icon ist in meinen resource system.
Zwar kann ich das ueber Icon einfach einfuegen, aber dann wird das Icon in so einen Kasten gesteckt. Ich moechte aber nur das Icon haben und nicht noch den Kasten dazu
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hier sieht man dass es totaler Blödsinn ist was Du machst:
http://doc.qt.nokia.com/4.6/qicon.html#paint
Und das ist wohl was Du suchsts... http://doc.qt.nokia.com/4.6/qicon.html#QIcon-2 :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

Nein du verstehst nicht was ich will.
Also guck, ich hoffe du bist im Mozilla Firefox wenn nicht gibst bestimmt den HomeButton, der ist genau so ein button, wie wenn du ihn mit Icon(Pixmap) laedst, das Pixmap ist das Haus und das Icon zeichnet das aber in das Viereck, das sich zeigt, wenn man drueber faehrt.
Wenn du dir nun den zurueckknopf anguckst, dann ist das nur der Zurueckknopf und kein viereck, das um ihn herrum ist.
und ich moechte genau das so was erreichen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Code: Alles auswählen

// leeres Icon erstellen
QIcon icon;
// neuen QPainter erstelen
QPainter *painter = new QPainter();
// auf einen Painter welcher kein QPaintImage hat ein QPixmap malen
painter->drawPixmap(0,0,QPixmap(":/Icons/ArrowUp.png"));
// Auf den immernoch leeren QPainter ein leeres QIcon malen
icon.paint(painter,0,0,512,512);
// der QAction ein leeres Icon geben
action->setIcon(icon); 
???

Das was Du meinst hat nichts mit dem Icon zu tun sondern mit dem Button-Style...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ja gut aber der style zeichnet ja auch nur den button, und painter kann ja auch aus der datei malen.
Also was muss ich denn aendern, dass das funktioniert?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das sind spezielle Button-Styles die zudem noch vom verwendeten Style abhängen. Wenn Du was spezielles willst musst Du wohl oder übel von QAbstractButton ableiten und den Buttons selbst malen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

aber ich kann doch einfach das Pixmap zeichnen lassen, da diese ja keinen hintergrund besitzt sondern nur das Bild
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:aber ich kann doch einfach das Pixmap zeichnen lassen, da diese ja keinen hintergrund besitzt sondern nur das Bild
Ein Icon besitzt auch nur das Bild und keinen Hintergrund! Das was die Umrandung zeichnet ist die Buttonklasse selber! Deshalb ist das Einzige was du tun kannst eine eigene Button-Klasse erstellen, die so ausschaut wie du willst.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Prizipiell ist der HomeButton kein QPushButton sondern ein QToolButton ... un da gibts ne Methode zwischen "zeige immer einen Rahmen" und "zeige nur Rahmen wenn Maus drüber" unmschaltet .. also nix selber ableiten. Einfach QToolButton Doku lesen (z.B. http://doc.qt.nokia.com/4.6/qtoolbutton.html und dann auf "More" ... da werden sie geholfen)
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

so habs hinbekommen, wie ich es wollte ohne Kasten.
Es ist nur ein schnelles Testbeispiel, aber es zeigt das prinzip ;-)
//Ok ich hab die Loesung gefunden mit
painter.setRenderHint(QPainter::SmoothPixmapTransform);
geht das verpixelte weg und siehe da ist unser button :-)

Code: Alles auswählen

#ifndef LINES_H
#define LINES_H
#include <QPushButton>
class Lines : public QPushButton
{
  Q_OBJECT

  public:
    Lines(QWidget *parent = 0);

  protected:
    void paintEvent(QPaintEvent *event);

};

#endif

Code: Alles auswählen

#include "mainwindow.h"
#include <QPainter>


Lines::Lines(QWidget *parent)
    : QPushButton(parent)
{

}

void Lines::paintEvent(QPaintEvent *event)
{
  QPainter painter(this);
  painter.setRenderHint(QPainter::SmoothPixmapTransform);
  if(!isDown())
    painter.drawImage(QRect(0,0,48,48),QImage(":/Power.png"));
  else
    painter.drawImage(QRect(0,0,256,256),QImage(":/Power.png"));
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das ist aber jetzt nichts halbes und nichts ganzes...
Probier das mal aus und staune was da für ein Murks rauskommt...

Code: Alles auswählen

#include <QPushButton>
#include <QWidget>
#include <QHBoxLayout>
#include <QPainter>
#include <QPaintEvent>
#include <QImage>
#include <QApplication>

class Button : public QPushButton {
    void paintEvent(QPaintEvent* e) {
        QPainter painter(this);
        painter.setRenderHint(QPainter::SmoothPixmapTransform);
        if(!isDown())
            painter.drawImage(QRect(0,0,48,48),QImage("./Power.png"));
        else
            painter.drawImage(QRect(0,0,256,256),QImage("./Power.png"));
    }
public:
    Button(QWidget* parent=0)
     : QPushButton(parent)
    {}
};

int main(int argc, char** argv) {
    QApplication app(argc, argv);
    QWidget w;
    QHBoxLayout *l = new QHBoxLayout(&w);
    
    Button* b = new Button;
    b->setText("Hallo");
    l->addWidget(b);
    
    b = new Button;
    b->setText("Mehr Hallo");
    l->addWidget(b);
    
    b = new Button;
    b->setText("Oh Gott, was ist hier los!!!");
    l->addWidget(b);
    
    b = new Button;
    b->setText("Schluss!");
    l->addWidget(b);
    
    w.show();
    return app.exec();
}
Prolem: Deine ganzen sizeHints stimmen einfach nicht, du übernimmst die von QPushButton - und das ist abhängig vom Style, vom Text, usw.
Deshalb wurde auch gesagt, du sollst von QAbstractButton ableiten, QPushButton spezialisieren macht in deinem Fall wenig Sinn.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Warum nicht

Code: Alles auswählen

QToolButton * tb = new QToolButton;
tb->setAutoRaise(false);
tb->setIcon(QIcon(":/Power.png"));
?

Das Verpixelte könnte auch hierdran liegen:

Code: Alles auswählen

    painter.drawImage(QRect(0, 0,  48,    48),QImage(":/Power.png"));
    painter.drawImage(QRect(0, 0, 256, 256),QImage(":/Power.png"));
Du zeichnest 2 mal verschiedene Größen ... das eine nur 1/5 des Anderen, da er dann skalieren muss --> pixel
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

@padreigh
ne das war schon in originalgroesse verpixelt, es liegt an der renderengine, aber mit dem der einen einstellung ist das weg.

so franz, wenn ich von AbstractButton ableite,(nehme dein Beispie mit QAB) zeigt sich bei mir gar nichts.
wenn ich den button erstelle und button.show() mache, sieht man ihn
Antworten