抗锯齿在相邻小部件之间留下细线

时间:2011-09-07 10:10:02

标签: c++ qt antialiasing

我有两个小部件都有相同颜色的深色背景。这些小部件位于QGridLayout内的相邻单元格中,ContentsMargins的所有边都为QStyle,间距为0。我使用自定义painter->setRenderHint(QPainter::Antialiasing, true);派生类进行绘制。

如果我不使用抗锯齿,一切看起来都像预期的那样 - 两个小部件的背景合并成一个连续的黑暗区域。打开抗锯齿(通过#include <QApplication> #include <QWidget> #include <QGridLayout> #include <QPainter> class foo : public QWidget { protected: void paintEvent(QPaintEvent *) { QPainter painter(this); int x1, y1, x2, y2; int radius = 20; int diam = 2 * radius; rect().getCoords(&x1, &y1, &x2, &y2); QPainterPath path; // This will be a rounded rectangle. path.moveTo(x1 + radius, y2); path.lineTo(x2 - radius, y2); path.arcTo(x2 - diam, y2 - diam, diam, diam, 270.0, 90.0); path.lineTo(x2, y1 + radius); path.arcTo(x2 - diam, y1, diam, diam, 0.0, 90.0); path.lineTo(x1 + radius, y1); path.arcTo (x1, y1, diam, diam, 90.0, 90.0); path.lineTo(x1, y2 - radius); path.arcTo (x1, y2 - diam, diam, diam, 180.0, 90.0); path.closeSubpath(); painter.setPen(Qt::gray); // Comment out the following line and the rounded rectangles // will not have a thin boundary of background color between them painter.setRenderHint(QPainter::Antialiasing, true); painter.fillPath(path, Qt::gray); painter.drawPath(path); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QGridLayout *l = new QGridLayout; l->setContentsMargins(0,0,0,0); l->setSpacing(0); foo *c1 = new foo; foo *c2 = new foo; l->addWidget(c1, 0, 0); l->addWidget(c2, 0, 1); QWidget *w = new QWidget; w->setMinimumSize(500,250); w->setLayout(l); w->show(); return a.exec(); } )会在这两个小部件之间留下一条很细的(1px)白线。

有可能以某种方式摆脱这条线吗?完全关闭抗锯齿不是一种选择,因为这两个小部件都有圆角,而且没有它们看起来很糟糕。

修改

我现在编写了一个“最小”的例子:

{{1}}

我正在使用Qt 4.7.3开发ubuntu。

2 个答案:

答案 0 :(得分:1)

尝试在创建路​​径时移动半像素,或在设置渲染提示后按translate(0.5, 0.5)移动。

答案 1 :(得分:0)

如果你知道这些难看的边界线会发生在哪里,你可以用一条直的灰线覆盖它们(如果仍然启用了抗锯齿,则可能需要两到三个像素宽)。不是很优雅,但它确实有效。