QWidget рендерится в QPixmap, кажется, игнорирует настройку "border-radius" таблицы стилей - PullRequest
0 голосов
/ 20 марта 2020

Мне нужно сохранить QPixmap из QWidget (в моем случае QPushButton), но, похоже, некоторые настройки таблицы стилей игнорируются.

Вот пример кода:

button = new QPushButton(QIcon(":/resources/icons/my_icon.png"), "Sample text", this);
button->setFocusPolicy(Qt::NoFocus);
button->setStyleSheet(" color: white; "
                      " background-color: gray; "
                      " font: 30px;"
                      " border-radius: 18px;");

button->setLayoutDirection(Qt::RightToLeft);
button->setIconSize(QSize(96, 96));
button->setGeometry(13, 10, 455, 100);

button->show();

QPixmap pixmap(button->size());
button->render(&pixmap);

Метод рендеринга, кажется, игнорирует "border-radius: 18px;" В поле таблицы стилей я попытался сохранить QPixmap в файл:

pixmap.save("test.png");

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

Я что-то не так делаю при использовании метода QWideget :: render (...)?

1 Ответ

0 голосов
/ 21 марта 2020

Ваша проблема в том, что QRegion в режиме визуализации c является прямоугольной angular областью.

void QWidget::render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))

Qt Не знаете, как сделать округленную прямоугольную angular область, вы должны вычислить вручную этот регион вы можете начать с этой функции;)

QRegion computeRegion(QPushButton*button, int radius)
{
    QRegion region(0, 0, button->width(),button->height(), QRegion::Rectangle);

    /** top left */
    QRegion round (0, 0, 2*radius, 2*radius, QRegion::Ellipse);
    QRegion corner(0, 0, radius, radius, QRegion::Rectangle);
    region = region.subtracted(corner.subtracted(round));

    /** top right */
    round = QRegion(button->width()-2*radius, 0, 2*radius, 2*radius, QRegion::Ellipse);
    corner = QRegion(button->width()-radius, 0, radius, radius, QRegion::Rectangle);
    region = region.subtracted(corner.subtracted(round));

    /** bottom right */
    round = QRegion(button->width()-2*radius, button->height()-2*radius, 2*radius, 2*radius, QRegion::Ellipse);
    corner = QRegion(button->width()-radius, button->height()-radius, radius, radius, QRegion::Rectangle);
    region = region.subtracted(corner.subtracted(round));

    /** bottom left */
    round = QRegion(0, button->height()-2*radius, 2*radius, 2*radius, QRegion::Ellipse);
    corner = QRegion(0, button->height()-radius, radius, radius, QRegion::Rectangle);
    region = region.subtracted(corner.subtracted(round));

    return  region;
}

затем использовать его в функции рендеринга

button->render(&pixmap,QPoint(),computeRegion(button,18));
...