【问题标题】:QWidget render to QPixmap seems to ignore "border-radius" setting of stylesheetQWidget 渲染到 QPixmap 似乎忽略了样式表的“border-radius”设置
【发布时间】:2020-07-01 09:30:04
【问题描述】:

我需要从 QWidget(在我的例子中是 QPushButton)中保存 QPixmap,但似乎忽略了一些样式表设置。

这是一个示例代码:

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(...) 方法时做错了吗?

【问题讨论】:

    标签: c++ qt qwidget qpixmap


    【解决方案1】:

    你的问题是render func中的QRegion是一个矩形区域。

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

    Qt 不知道如何制作一个圆角矩形区域,你应该手动计算这个区域你可以从这个函数开始;)

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多