сглаживание оставляет тонкую грань между соседними виджетами - PullRequest
3 голосов
/ 07 сентября 2011

У меня есть два виджета, которые имеют темный фон одного цвета.Эти виджеты находятся в соседних ячейках в пределах QGridLayout, который имеет ContentsMargins и интервал 0 со всех сторон.Я использую пользовательский класс QStyle для рисования.

Если я не использую сглаживание, все выглядит как положено - фоны двух виджетов сливаются в одну непрерывную темную область.Включение сглаживания (через painter->setRenderHint(QPainter::Antialiasing, true);) оставляет тонкую (1px) белую линию между этими двумя виджетами.

Можно ли как-то избавиться от этой линии?Отключить сглаживание вообще невозможно, поскольку эти два виджета имеют закругленные углы, и без них они выглядят плохо.

EDIT

Теперь я составил «минимальный» пример:

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

Я работаю над Ubuntu с Qt 4.7.3.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Попробуйте сместить на полпикселя либо при создании пути, либо на translate(0.5, 0.5) после установки подсказок рендеринга.

0 голосов
/ 08 сентября 2011

Если вы знаете, где будут происходить эти неприглядные граничные линии, вы можете просто перезаписать их прямой серой линией (которая может иметь ширину два или три пикселя, если сглаживание все еще включено).Не очень элегантно, но делает свою работу.

...