vri*_*nce 6 c++ qt qt4 rasterizing
我尝试drawRoundedRect直接用方法绘制一个圆形矩形QPixmap(没有渲染引擎涉及这里exept纯Qt一个...),我仔细检查矩形的大小与我的pixmap的大小:
Pixmap : QSize(50, 73)
Rectangle: QRect(0,0 48x11)
Run Code Online (Sandbox Code Playgroud)
看到充足的空间......
编辑:一些代码
pixmap = QPixmap(50,73); //example size that match my case
QRectF rect(0,0,48,11);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setWorldMatrixEnabled(false);
painter.setPen(QPen()); //no pen
painter.setBrush(QBrush(color));
painter.drawRoundedRect(rect, 2.0, 2.0);
Run Code Online (Sandbox Code Playgroud)
但它始终以4个不同角落的直线结束!像那样 :

我直接将pixmap输出到一个文件,以确保我在显示期间没有刮它...相同的形状.
有人知道Qt圆形矩形半径小吗?我很久以前就看到过这个问题,但我并不清楚如何处理它!
Ste*_*e S 14
看起来你没有使用抗锯齿(即QPainter::Antialiasing渲染提示).这是一个没有它的Qt怪癖.从我所看到/听到的,Qt开发人员并不十分关心修复这个问题(大多数人都想要反抗锯齿).
解决方法(除了使用抗锯齿之外)是用QPainter::drawLine()和自己绘制矩形QPainter::drawArc().你可能不得不玩数字,直到看起来正确 - 直接计算往往会出现一两个像素.此外,您可能会发现,即使使用此方法,右下角也不会与其他角完全相同.
如果你感觉有点雄心勃勃,你可以尝试解决这个并向Qt提交补丁.
更新:在Qt 5中改变了圆弧绘制结果.根据我的经验,这是一个很大的改进.
我知道这是一个老问题,但对于Qt5调用的用户来说setRenderHint(QPainter::Qt4CompatiblePainting);似乎QPainter可以解决问题。
编辑:
我找到了一个生成完美圆角矩形和边框颜色的解决方案,它看起来与QPushButton's border 使用的圆角矩形相同。这就是我实现paintEvent此目标的方法:
void MyButtonGroup::paintEvent(QPaintEvent * e)
{
int borderSize = 5;
QColor borderColor = Qt::red;
QColor backgroundColor = Qt::blue;
int borderRadius = 3;
QPen pen;
pen.setWidth(borderSize);
pen.setColor(borderColor);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(pen);
QRectF rect(rect().x() + borderSize / 2,
rect().y() + borderSize / 2,
rect().width() - borderSize,
rect().height() - borderSize);
if(borderSize % 2 == 0)
{
painter.drawRoundedRect(rect,
borderSize,
borderSize);
}
else
{
painter.drawRoundedRect(rect.translated(0.5, 0.5),
borderRadius,
borderRadius);
}
QBrush brush(backgroundColor);
pen.setBrush(brush);
painter.setBrush(brush);
if(borderSize % 2 == 0)
{
painter.drawRoundedRect(rect,
borderRadius,
borderRadius);
}
else
{
painter.drawRoundedRect(rect.translated(0.5, 0.5),
borderRadius,
borderRadius);
}
QWidget::paintEvent(e);
}
Run Code Online (Sandbox Code Playgroud)
我发布此内容是因为我发现实现此结果有点困难:

| 归档时间: |
|
| 查看次数: |
9281 次 |
| 最近记录: |