Seite 1 von 2
QIcon zeichnen
Verfasst: 15. August 2010 23:38
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);
Verfasst: 15. August 2010 23:41
von Christian81
Gibts das Icon überhaupt und was soll das Ganze? QIcon Doku lesen sollte helfen...
Verfasst: 16. August 2010 00:07
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
Verfasst: 16. August 2010 06:30
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 
Verfasst: 16. August 2010 06:50
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.
Verfasst: 16. August 2010 07:03
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...
Verfasst: 16. August 2010 07:11
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?
Verfasst: 16. August 2010 07:41
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.
Verfasst: 16. August 2010 08:34
von Nvidia
aber ich kann doch einfach das Pixmap zeichnen lassen, da diese ja keinen hintergrund besitzt sondern nur das Bild
Verfasst: 16. August 2010 08:57
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.
Verfasst: 16. August 2010 12:04
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)
Verfasst: 17. August 2010 10:03
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"));
}
Verfasst: 17. August 2010 12:35
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.
Verfasst: 17. August 2010 12:39
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
Verfasst: 17. August 2010 18:35
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