下に影があるフレームレス ウィンドウを作成しようとしています。Qt:: FramelessWindowHint フラグを使用してボーダレス ウィンドウを作成すると、影が含まれません。しかし、 QGraphicsDropShadowEffectオブジェクトを作成し、それをsetGraphicsEffect関数を介してウィジェットに渡すことで、簡単に子ウィジェットに影を付けることができます。しかし、これは QMainWindow では機能しないようです。Qtでフレームレスウィンドウに影を付けるのを手伝ってください...
3 に答える
この簡単なハックを使用してそれを行うことができます:
「QWidget」(ウィジェットなど) を MainWindow に追加し、MainWindow にあるすべてのものをウィジェットに移動します。次に、これを行います:
setAttribute(Qt::WA_TranslucentBackground); //enable MainWindow to be transparent
QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
ui->widget->setGraphicsEffect(effect);
これは私にとってはうまくいくようです。見る:
私は 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 インスタンスの属性でさえ機能しません。ネットで情報をググってみると、思っていた以上に制作が大変であることがわかりました。
それほど素晴らしい解決策ではないのは、 !QtCore.Qt.ToolTip
の代わりにウィンドウ フラグを使用することです。FramelessWindowHint