Eigener QStyle - Bild als QPushButton

Alles rund um die Programmierung mit Qt
Antworten
cool.runnings
Beiträge: 15
Registriert: 26. November 2007 17:12

Eigener QStyle - Bild als QPushButton

Beitrag 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
cool.runnings
Beiträge: 15
Registriert: 26. November 2007 17:12

Beitrag 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 );
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
cool.runnings
Beiträge: 15
Registriert: 26. November 2007 17:12

Beitrag 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]
Antworten