Как поместить тень в бескаркасное окно в Qt

Я пытаюсь создать бескаркасное окно, которое имеет тень под ним.Когда мы создаем окно без границ с Qt:: FramelessWindowHint флаг он не содержит тени. Но мы можем легко поместить тени в дочерние виджеты, создав QGraphicsDropShadowEffect

3 ответов


вы можете сделать это, используя этот простой хак:


добавьте "QWidget" (скажем, виджет) в Главное окно и переместите все, что находится в главном окне, в виджет. После этого:

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


я следовал точно инструкциям, которые были даны zeFree (используя Qt/C++), и моя тень действительно была щелчком мыши (используя элементарную ОС Freya-я не знаю, есть ли другое поведение между ним и Ubuntu, OX или Windows)... Я не могу понять, почему твой не был.--3-->

единственная разница заключается в том, что я сделал поля родительского окна и радиус размытия больше и удалил смещение тени.

вот мой фрагмент:

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);
}

изменить: Нет, мой windows не была clickthrough (я думаю, что спал, когда писал это). Действительно даже Qt::WA_TransparentForMouseEvent атрибут в моем экземпляре QDialog не работает. Шлифуя информацию в Интернете, я обнаружил, что сделать эту работу намного сложнее, чем я думал.


не так решение aweseome будет использовать QtCore.Qt.ToolTip флаг окна вместо FramelessWindowHint!

at least a little shadow