Тень скрывается, когда установлен Qt :: FramelessWindowHint - PullRequest
0 голосов
/ 19 мая 2019

Несколько раз я пытался создать приложение без рамки, предоставляемой ОС, но после нескольких часов усилий я бросил эту идею. Проблема в том, что когда я устанавливаю 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 голосов
/ 20 мая 2019

Полный и минимальный пример отсутствует, но, возможно, вы только что установили атрибуты на неправильные свойства.Если вы наследуете QWidget вместо QDialog , это также может быть причиной странного поведения, которое вы испытываете.Например, при реализации какого-либо настраиваемого диалогового окна на основе представления лучше предоставить центральный контейнер по умолчанию с некоторым макетом и размещать стили в контейнере, а не в диалоге, чтобы избежать проблем, связанных с ОС или 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

Как правило, здесь главное установить стили для дочерних элементов диалога, а не для самого диалога.Надеемся, что приведенный пример прояснил вам ситуацию, и вы сможете достичь того, чего хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...