Подтвердить что ты не робот

QT4: Прозрачное окно с закругленными углами

Как создать частично прозрачное окно с закругленными границами (без стандартных границ)?

(я использовал Qt::FramelessWindowHint для отключения стандартных границ)

Я попробовал таблицы стилей, но border-radius и opacity, похоже, не влияют на окно, он работает только с дочерними элементами закрывающего виджета.

Моя вторая идея заключалась в том, чтобы сделать окно полностью прозрачным (с setWindowOpacity), а затем добавить дополнительный виджет с закругленными углами (поскольку border-radius работает с дочерними элементами), а затем группировать все мои другие виджеты в этот виджет, Но это не работает, так как setWindowOpacity влияет на всех детей (я не нашел способа изменить это поведение).

И любые способы сделать прозрачное внешнее окно, о котором я мог думать (например, stylesheets opacity), не работают должным образом (я получаю только черный ящик вместо прозрачного окна)

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

У меня была аналогичная проблема, когда я хотел нарисовать виджет верхнего уровня и отобразить только окрашенную часть. setWindowOpacity изменила непрозрачность окрашенной части, чего я не хотел.

this->setAttribute(Qt::WA_TranslucentBackground, true);

изменил непрозрачность виджета без раскрашенной части. Я просто попытался броситься на кнопку, и это также выглядит совершенно непрозрачным. Поэтому вы должны иметь возможность отображать других детей, как вам нравится.

Ответ 2

Я думаю, вы должны использовать маски виджетов, как показано в следующем примере из Qt:

http://doc.qt.io/qt-5/qtwidgets-widgets-shapedclock-example.html

Я думаю, вы найдете то, что ищете.

Надеюсь, это поможет немного!

Ответ 3

 void MainForm::resizeEvent(QResizeEvent * /* event */)
{
    QImage image(this->size(), QImage::Format_Mono);
    image.fill(0);

    if(!this->isFullScreen() && !this->isMaximized())
    {
        image.setPixel(0, 0, 1); image.setPixel(1, 0, 1); image.setPixel(2, 0, 1); image.setPixel(3, 0, 1);
        image.setPixel(0, 1, 1); image.setPixel(1, 1, 1);
        image.setPixel(0, 2, 1);
        image.setPixel(0, 3, 1);

        image.setPixel(width() - 4, 0, 1); image.setPixel(width() - 3, 0, 1); image.setPixel(width() - 2, 0, 1); image.setPixel(width() - 1, 0, 1);
                                                                              image.setPixel(width() - 2, 1, 1); image.setPixel(width() - 1, 1, 1);
                                                                                                                 image.setPixel(width() - 1, 2, 1);
                                                                                                                 image.setPixel(width() - 1, 3, 1);

        image.setPixel(0, height() - 4, 1);
        image.setPixel(0, height() - 3, 1);
        image.setPixel(0, height() - 2, 1); image.setPixel(1, height() - 2, 1);
        image.setPixel(0, height() - 1, 1); image.setPixel(1, height() - 1, 1); image.setPixel(2, height() - 1, 1); image.setPixel(3, height() - 1, 1);

                                                                                                                                                  image.setPixel(width() - 1, height() - 4, 1);
                                                                                                                                                  image.setPixel(width() - 1, height() - 3, 1);
                                                                                                    image.setPixel(width() - 2, height() - 2, 1); image.setPixel(width() - 1, height() - 2, 1);
        image.setPixel(width() - 4, height() - 1, 1); image.setPixel(width() - 3, height() - 1, 1); image.setPixel(width() - 2, height() - 1, 1); image.setPixel(width() - 1, height() - 1, 1);
    }
    this->setMask(QPixmap::fromImage(image));
}