设置Qt :: FramelessWindowHint

时间:2019-05-18 21:17:10

标签: c++ qt

有几次我试图创建一个没有操作系统提供边界的应用程序,但是经过数小时的努力,我提出了这个想法。问题是,当我将Qt::FramelessWindowHint设置为窗口小部件时,创建一个实例并显示该实例时,它会隐藏其阴影。这是我正在研究的示例。

Widget without shadow

在此示例中,您可以看到小部件周围没有阴影。但是孔内有阴影。下面提供了来自小部件构造函数的代码段,该代码段使孔内的阴影变暗。

MyWidget::MyWidget(// some params)
{
  ...

  setAttribute(Qt::WA_NoSystemBackground);
  setAttribute(Qt::WA_TranslucentBackground);
  setWindowFlags(Qt::FramelessWindowHint);
  QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect;
  effect->setBlurRadius(5);
  effect->setOffset(0, 0);
  setGraphicsEffect(effect);

  ...
}

// main.cpp

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  MyWidget w;
  w.show();
  return app.exec();
}

但是如何才能在小部件周围绘制阴影?

1 个答案:

答案 0 :(得分:0)

缺少完整的示例,但是您可能只是将属性设置为错误的属性。如果您继承的是QWidget而不是QDialog,这也可能是您遇到奇怪行为的原因。例如,当实现一些基于自定义视图的对话框时,最好为默认的中央容器提供一些布局,并在容器上而不是在对话框上放置样式,以避免与OS相关的问题或Qt问题。另外,如果要引入自定义对话框,建议继承QDialog本身而不是QWidget,因为Qt在与定位,设置模态等有关的幕后为您做了很多工作。因此,应首选标准Qt行为。

现在是示例,请在下面查看:

// ShadowedDialog.h
#pragma once
#include <QDialog>

class ShadowedDialog
    : public QDialog
{
    Q_OBJECT
public:
    ShadowedDialog(QWidget* parent = nullptr);
    virtual ~ShadowedDialog();
};


// ShadowedDialog.cpp
#include <QGraphicsDropShadowEffect>
#include <QHBoxLayout>

#include "ShadowedDialog.h"

ShadowedDialog::ShadowedDialog(QWidget* parent)
    : QDialog(parent)
{
    // Set your own window flags, but don't forget to keep the default ones for the dialog.
    this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);

    // Translucent background is also needed in order for the shadow to work.
    this->setAttribute(Qt::WA_TranslucentBackground, true);

    // You would never need to do that, but this will make sure example will be visible enough.
    this->setFixedSize(400, 400);

    // Then, UI is setup.
    auto container = new QWidget();
    container->setObjectName("container");
    container->setStyleSheet("#container{background-color:#ffffff;border:1px solid #000000;}");
    auto layout = new QHBoxLayout();
    layout->addWidget(container);
    this->setLayout(layout);

    // And finally, QGraphicsDropShadowEffect is put with red drop shadow.
    auto effect = new QGraphicsDropShadowEffect();
    effect->setBlurRadius(5);
    effect->setXOffset(5);
    effect->setYOffset(5);
    effect->setColor(QColor("#ff0000"));

    container->setGraphicsEffect(effect);
}

ShadowedDialog::~ShadowedDialog()
{
}

该示例非常简单,基本上可以执行以下操作:  1.设置一些带有白色背景和黑色边框的容器。  2.然后,设置QGraphicsDropShadowEffect。可能这就是您想要在对话框上显示的阴影。

结果看起来像这样(在Windows 7上测试):

Very simple Qt dialog with red drop shadow on Windows 7

通常,这里的主要操作是在对话框的子级而不是对话框本身上设置样式。希望给出的示例可以使您理解清楚,并且您将能够实现想要的目标。