Как создать одну сторону, закругленную, а другую сторону, плоский прямоугольник, используя QPainter? - PullRequest
0 голосов
/ 28 июня 2018

Я хочу добиться чего-то подобного, используя QPainter

Я пытался использовать 2 скругленных прямоугольника в QPainter рядом, но мне не удалось получить изображение выше.

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QRectF leftRect= QRectF(0, 0, 300, 150);
    QRectF rightRect= QRectF(300, 0, 300, 150);
    painter.fillRect(leftRect, QColor("black");
    painter.drawRoundedRect(leftRect,15,35);
    painter.setPen(QPen("white"));
    painter.setPen(QPen("black"));
    painter.fillRect(rightRect, QColor("white");
    painter.drawRoundedRect(rightRect,15,35);    

Это то, что я пытался и получил это enter image description here

Я пробовал это с QPainterPath

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QRectF leftRect= QRectF(0, 0, 300, 150);
QRectF rightRect= QRectF(300, 0, 300, 150);
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRoundedRect(leftRect, 15, 35);
QPen pen(Qt::white, 1);
painter.setPen(pen);
painter.fillPath(path, Qt::black);
painter.drawPath(path);

QPainterPath path2;
path2.setFillRule(Qt::WindingFill);
QPen pen1(Qt::black, 1);
painter.setPen(pen1);
path2.addRoundedRect(rightRect, 15, 35);

painter.fillPath(path2, Qt::white);
painter.drawPath(path2);  

И получил это: enter image description here

1 Ответ

0 голосов
/ 28 июня 2018

Лучшее, что Qt может предложить в этом отношении - это отдельные радиусы округления x и y. Так что ничего такого, что сделает это за вас, не будет.

Кажется, что способ получить эту геометрию состоит в том, чтобы использовать QPainterPath для составления фигуры из нескольких подкомпонентов, в вашем случае дуги для радиуса и 3 линий для остальных.

Вы должны быть в состоянии перевести и отразить художника, чтобы нарисовать другую сторону. Таким образом, вы заполняете и обрисовываете левую сторону, затем переворачиваете художника и обрисовываете правую сторону.

Кроме того, в случае, если вы рисуете что-то вроде, например, индикатора выполнения, существует другой способ действий. Вы нарисуете прямоугольник с закругленными углами и будете использовать его в качестве маски, а затем сможете заполнить нужное количество, нарисовав прямоугольник, который будет обрезан в желаемой форме с помощью маски.

ОК, похоже, вам понадобится дополнительная помощь, вот рабочий код, который вы можете настроить:

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPainterPath path;

    // compose the "half"
    path.moveTo(20, 0);
    path.lineTo(100, 0);
    path.lineTo(100, 40);
    path.lineTo(20, 40);
    path.arcTo(0, 0, 40, 40, -90, -180);

    // draw black half
    painter.setBrush(Qt::black);
    painter.setPen(QPen(Qt::black, 1));
    painter.drawPath(path);

    // mirror and reposition the painter
    QTransform mirror(-1, 0, 0, 0, 1, 0, 0, 0, 1);
    painter.setTransform(mirror);
    painter.translate(-200, 0);

    // draw white half
    painter.setBrush(Qt::white);
    painter.drawPath(path);
...