方法一:
代碼實現
在窗口構造函數中加入: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/