gpt4 book ai didi

c++ - 抗锯齿在相邻的小部件之间留下细线

转载 作者:太空狗 更新时间:2023-10-29 23:08:58 27 4
gpt4 key购买 nike

我有两个小部件,它们都具有相同颜色的深色背景。这些小部件位于 QGridLayout 中的相邻单元格中,该单元格具有 ContentsMargins 且所有边的间距均为 0。我使用自定义 QStyle 派生类进行绘图。

如果我不使用抗锯齿,一切看起来都如预期 - 两个小部件的背景合并为一个连续的暗区。打开抗锯齿(通过 painter->setRenderHint(QPainter::Antialiasing, true);)在这两个小部件之间留下一条细 (1px) 的白线。

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

编辑

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

#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();
}

我正在使用 Qt 4.7.3 在 ubuntu 上工作。

最佳答案

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

关于c++ - 抗锯齿在相邻的小部件之间留下细线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com