QT4: прозрачное окно с закругленными углами - PullRequest
21 голосов
/ 15 декабря 2009

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

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

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

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

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

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

16 голосов
/ 15 декабря 2009

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

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

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

7 голосов
/ 15 декабря 2009

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

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

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

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

2 голосов
/ 27 июня 2010
 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...