QT筆記之實現陰影窗口


方法一:

代碼實現

在窗口構造函數中加入: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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM