13

下に影があるフレームレス ウィンドウを作成しようとしています。Qt:: FramelessWindowHint フラグを使用してボーダレス ウィンドウを作成すると、影が含まれません。しかし、 QGraphicsDropShadowEffectオブジェクトを作成し、それをsetGraphicsEffect関数を介してウィジェットに渡すことで、簡単に子ウィジェットに影を付けることができます。しかし、これは QMainWindow では機能しないようです。Qtでフレームレスウィンドウに影を付けるのを手伝ってください...

4

3 に答える 3

14

この簡単なハックを使用してそれを行うことができます:


「QWidget」(ウィジェットなど) を MainWindow に追加し、MainWindow にあるすべてのものをウィジェットに移動します。次に、これを行います:

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

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

これは私にとってはうまくいくようです。見る:

影のあるメイン ウィンドウの錯覚

于 2013-04-02T06:13:59.533 に答える
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);
}

編集:いいえ、私のウィンドウはクリックスルーではありませんでした(書いたときは寝ていたと思います)。実際Qt::WA_TransparentForMouseEvent、QDialog インスタンスの属性でさえ機能しません。ネットで情報をググってみると、思っていた以上に制作が大変であることがわかりました。

于 2015-08-05T10:27:07.447 に答える
0

それほど素晴らしい解決策ではないのは、 !QtCore.Qt.ToolTipの代わりにウィンドウ フラグを使用することです。FramelessWindowHint

少なくとも少しの影

于 2015-05-05T18:57:12.957 に答える