QT笔记之实现阴影窗口

Posted 车臣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT笔记之实现阴影窗口相关的知识,希望对你有一定的参考价值。

方法一:

代码实现

重写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/

以上是关于QT笔记之实现阴影窗口的主要内容,如果未能解决你的问题,请参考以下文章

Qt5 圆角加阴影窗口简单实现

Qt动画窗口,Qt之对话框消失动画

QT笔记之自定义窗口拖拽移动

29.QT-自定义窗口拖动自定义QToolButton/QPushButton开关按钮界面阴影

css有用的代码片段

VC++界面编程之--阴影窗口的实现详解