Seite 1 von 1

Eigener QStyle - Bild als QPushButton

Verfasst: 17. August 2009 15:07
von cool.runnings
Hallo,

ich bin gerade dabei einen eigenen QStyle zu schreiben. Vielmehr habe ich garde angefangen :)
Wenn ich alles richtig verstanden habe, dann muss ich einen vorhanden Style (oder auch direkt von QStyle) ableiten und die Funktionen wie etwa

Code: Alles auswählen

void QStyle::drawControl ( ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const
überladen. Soweit so gut.
Für einen QPushButton hätte ich jetzt gerne ein Bild genommen, was er dann zeichnen soll. Ich weiß aber nicht, wie ich das hinbekommen soll. Hat hier jemand ne Idee?

Gruß
cool.runnings

Verfasst: 18. August 2009 07:13
von cool.runnings
Inzwischen habe ich es hinbekommen, dass das Bild als Hintergrund für den Button verwendet wird. Jetzt habe ich aber das Problem, dass der Text nicht richtig angezeigt wird.
Ich kann ihn horizontal oder vertikal zentrieren, aber beides zusammen geht nicht.

Hier der Code:

Code: Alles auswählen

 
const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option);
if ( !button ) return;

QString text = button->text;
QRect target = painter->window();
                
QImage img(":/SSTDesignMain/Resources/tb_bk.png");
img = img.scaled( target.width(), target.height() );
QPixmap btn = QPixmap::fromImage( img );
QBrush brush( btn );

QFont font("FranklinGothic Medium");
font.setPixelSize(14);
QPen  pen(Qt::white);

painter->setFont(font);
painter->setPen(pen);
                
painter->fillRect( target, brush );
painter->drawText( target, Qt::AlignCenter,  button->text );

Verfasst: 18. August 2009 08:22
von franzf
Ich kann ihn horizontal oder vertikal zentrieren, aber beides zusammen geht nicht.
Was meinst du damit? Hast du es schon kombiliert und das funktioniert nicht?
Bitte etwas genauer :)

Außerdem:

Code: Alles auswählen

QRect target = painter->window();
Das ist doch Käse ;) Für was hat QStyleOption ein "rect"?
Genau, um dir zu sagen in welchen Bereich du zeichnen sollst ;)

Und

Code: Alles auswählen

QImage img(":/SSTDesignMain/Resources/tb_bk.png"); 
img = img.scaled( target.width(), target.height() ); 
QPixmap btn = QPixmap::fromImage( img ); 
QBrush brush( btn );
Ich versteh nicht, warum alle immer den Umweg über QImage machen, wenn sie ein QPixmap brauchen...
Geht doch echt schneller so:

Code: Alles auswählen

QPixmap pix( ":/SSTDesignMain/Resources/tb_bk.png" );
QBruch brush( pix.scaled(target.width(), target.height() ) );
Natürlich ist target das option->rect. Wobei ich mich frage wie komisch der Button ausschaut, wenn da immer ein total verzerrtes Pixmap im Hintergrund liegt.

Verfasst: 18. August 2009 14:14
von cool.runnings
Hallo,

das mit dem Text hat sich inzwischen erledigt, ich muss noch painter->restore() aufrufen, dann erscheint der Text auch auf dem Button.

Aber kaum ist das eine Problem behoben, taucht das nächste auf.

Wenn nun statt dem Element

Code: Alles auswählen

CE_PushButtonBevel[quote] eine Element vom Typ [/quote]CE_RadioButton
übergeben wird, wird nicht meine DrawControl Methode aufgerufen, sondern die von QCommonStyle.[/code]