如何在Qt中为无框窗口添加阴影

时间:2012-09-10 08:21:56

标签: qt window shadow borderless

我正在尝试创建一个在其下面有阴影的无框窗口。当我们使用 Qt :: FramelessWindowHint 标志创建无边框窗口时,它不包含阴影。 但是我们可以通过创建 QGraphicsDropShadowEffect 对象轻松地为子窗口小部件添加阴影,然后通过 setGraphicsEffect 函数将其传递给窗口小部件。但这似乎对QMainWindow不起作用。请帮我把阴影放到Qt的无框窗口......

3 个答案:

答案 0 :(得分:13)

你可以使用这个简单的黑客来做到这一点:


向MainWindow添加“QWidget”(比如小部件),并将MainWindow上的所有内容移动到小部件。然后这样做:

setAttribute(Qt::WA_TranslucentBackground); //enable MainWindow to be transparent

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
ui->widget->setGraphicsEffect(effect);

这似乎对我有用。参见:

illusion of a main window having a shadow

答案 1 :(得分:2)

我完全按照zeFree给出的说明(使用Qt / C ++),我的影子确实是点击式的(使用Elementary OS Freya - 我不知道它和Ubuntu之间是否存在不同的行为,OX或Windows)......我无法想象为什么你的不是。

唯一的区别是我将父窗口边距和模糊半径都设置得更大,并删除了阴影偏移。

这是我的代码:

void addDialogShadow(QWidget *target) {
    target->window()->setAttribute(Qt::WA_TranslucentBackground);
    target->window()->layout()->setMargin(50);
    QGraphicsDropShadowEffect* ef = new QGraphicsDropShadowEffect;
    ef->setBlurRadius(50);
    ef->setOffset(0);
    target->setGraphicsEffect(ef);
}

编辑: 不,我的窗户没有点击(我觉得我写的时候睡着了)。实际上,我的QDialog实例中的偶数Qt::WA_TransparentForMouseEvent属性不起作用。在网上研究信息,我发现让这项工作比我想象的要困难得多。

答案 2 :(得分:0)

一个不那么令人遗憾的解决方案是使用QtCore.Qt.ToolTip窗口标志而不是FramelessWindowHint

at least a little shadow