QT筆記之實現陰影視窗

weixin_34119545發表於2016-06-19

方法一:

程式碼實現

在視窗建構函式中加入: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);

 

實現效果如圖:

QT實現陰影視窗(一)(轉) - twyok - twyok的部落格

轉載:http://twyok.blog.163.com/blog/static/812293032013215506418/

相關文章