方法一:
程式碼實現
在視窗建構函式中加入:setAttribute(Qt::WA_TranslucentBackground),保證不被繪製上的部分透明
重寫void paintEvent(QPaintEvent *event);
void QT_Test::paintEvent(QPaintEvent *event) { QPainterPath path; path.setFillRule(Qt::WindingFill); path.addRect(10, 10, this->width()-20, this->height()-20); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.fillPath(path, QBrush(Qt::white)); QColor color(0, 0, 0, 50); for(int i=0; i<10; i++) { QPainterPath path; path.setFillRule(Qt::WindingFill); path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2); color.setAlpha(150 - qSqrt(i)*50); painter.setPen(color); painter.drawPath(path); } }
方法二:
用代用陰影的背景圖片實現
QT的視窗對於一般的視窗程式來說,已經完全夠用了。但有時候我們要求介面比較精美,或者還想自定義皮膚之類的話,就需要自己定義視窗。這裡介紹一種簡單的自定義視窗的方法。
自定義樣式可以達到很多的自定義皮膚的效果,但自定義樣式有時不能指定視窗的形狀,或者實現視窗的陰影效果(使用QT的QGraphicsEffect定義陰影,但執行效率較低)。這樣的話可以過載視窗的paintEvent函式實現自繪製視窗。
先準備一張有視窗陰影的背景圖,然後在paintEvent函式裡面使用QPainterx繪製這張圖。
這裡將視窗類命名為GraphicDialog
示例程式碼如下:
class GraphicDialog :
public QDialog
{
public:
GraphicDialog(QWidget* parent = NULL, Qt::WindowFlags f = 0/* Qt::FramelessWindowHint*/);
~GraphicDialog(void);
protected:
void paintEvent(QPaintEvent *);
QPixmap background;
};
在視窗類建構函式中:
setWindowFlags(Qt::FramelessWindowHint); //無標題視窗
setAttribute(Qt::WA_TranslucentBackground);
background.load(":/Images/DialogBackground");
在paintEvent中
QPainter p(this);
p.drawPixmap(0, 0, rect().width(), rect().height(), background);
實現效果如圖:
轉載:http://twyok.blog.163.com/blog/static/812293032013215506418/