基本思路:
1.将父窗口的背景拷贝到pushbutton的背景中;
2.重写paintEvent()方法;
目前存在一个缺点,当动态移动时需要手动刷新pushbutton的背景,因为背景拷贝是在构造函数完成的。
待续完善 .....
a) TPushButton.h文件
#ifndef TPUSHBUTTON_H #define TPUSHBUTTON_H #include <qpushbutton.h> class TPushButton: public QPushButton { private: QString m_picture; public: TPushButton( QWidget *parent, const char *name=0 ); void SetBackground(const QString& ); void paintEvent( QPaintEvent * ); }; #endif
b) TPushButton.cpp文件
#include <qpainter.h> #include <stdio.h> #include <unistd.h> #include "../debug/debug.h" #include "TPushButton.h" #if 1 #define _debug_btn #endif #ifdef _debug_btn #define debug_btn(fmt,...) debug(fmt,##__VA_ARGS__) #else #define debug_btn(fmt,...) #endif TPushButton::TPushButton( QWidget *parent, const char *name ) : QPushButton( parent, name ) { #if 1 setBackgroundPixmap(*parentWidget()->backgroundPixmap()); setBackgroundOrigin(QWidget::ParentOrigin); //当有多个父控件时可使用绝对坐标,QWidget::WindowOrigin或QWidget::AncestorOrigin #else setAutoMask(TRUE); setBackgroundMode(NoBackground); #endif } void TPushButton::SetBackground(const QString& picture) { m_picture = picture; } void TPushButton::paintEvent( QPaintEvent *event ) { debug_btn("paintEvent/n"); QPainter paint(this); QPixmap *icon = new QPixmap(m_picture); if(m_picture==""){ debug_btn("drawButton/n"); drawButton( &paint ); }else { int x1, y1, x2, y2; rect().coords( &x1, &y1, &x2, &y2 ); if(isDown()) { debug_btn("draw rect/n"); QColorGroup g = colorGroup(); paint.setPen( g.foreground() ); paint.setBrush( QBrush(g.button(),NoBrush) ); erase( event->region() ); paint.drawPixmap( 1, 1, *icon ); drawButtonLabel(&paint); paint.setPen( QColor(80,80,80) );//g.shadow() paint.drawRect( x1, y1, x2-x1+1, 1 ); paint.drawRect( x1, y1, 1, y2-y1+1 ); paint.setPen( QColor(250,250,250) );//g.shadow() paint.drawRect( x1, y2, x2-x1+1, 1 ); paint.drawRect( x2, y1, 1, y2-y1+1 ); }else{ debug_btn("drawPixmap/n"); erase( event->region() ); paint.drawPixmap( 0, 0, *icon ); drawButtonLabel(&paint); } if ( hasFocus() ) { QRect r(x1, y1, x2-x1, y2-y1); style().drawFocusRect( &paint, r , colorGroup(), &colorGroup().button() ); } } delete icon; }