我需要从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);
render方法似乎忽略了“ border-radius:18px;”。样式表的字段,我尝试将QPixmap保存到文件:
pixmap.save("test.png");
但是保存的图像是一个矩形,没有圆形边框。当应用程序显示时,QPushButton具有正确的圆形边框。
使用QWideget :: render(...)方法时我做错什么了吗?
您的问题是渲染功能中的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));