Я создавал базовую графическую программу (например, MS Paint) с простым графическим интерфейсом. У меня есть два класса, где один — это MainWindow, в котором хранятся все кнопки, ползунки и т. Д., А второй класс — это пользовательский виджет DrawingArea, на котором пользователь может рисовать.
В основном я реализовал большинство функций, но, к сожалению, я застрял в функции заполнения, которая должна работать точно так же, как в MS Paint. Я решил использовать так называемый алгоритм floodFill, и после нескольких часов борьбы (я новичок в Qt) мне удалось заставить его работать. Но совсем нет. Проблема в том, что я могу заполнить только черные области (фигуры, линии, точки и т. Д.) Выбранным цветом. Но когда дело доходит до заливки разных цветов, он просто помещает один пиксель в выбранный цвет. В заполненной функции (…) ниже я передаю два аргумента — точку (mouseClicked) и цвет этой точки. Вот:
void drawingArea::fill(const QPoint &point, QColor act)
{
QPainter painter(&image);
QPen myPen(actualColor);
myPen.setWidth(1);
painter.setPen(myPen);
QQueue<QPoint> pixels;
pixels.enqueue(point);
while(pixels.isEmpty() == 0)
{
QPoint newPoint = pixels.dequeue();
QColor actual;
actual.fromRgb(image.pixel(newPoint));
if(actual == act)
{
painter.drawPoint(newPoint);
update();
QPoint left((newPoint.x()-1), newPoint.y());
if(left.x() >0 && left.x() < image.width() && image.pixel(left) == act.rgb())
{
pixels.enqueue(left);
painter.drawPoint(left);
update();
}
QPoint right((newPoint.x()+1), newPoint.y());
if(right.x() > 0 && right.x() < image.width() && image.pixel(right) == act.rgb())
{
pixels.enqueue(right);
painter.drawPoint(right);
update();
}
QPoint up((newPoint.x()), (newPoint.y()-1));
if(up.y() > 0 && up.y() < image.height() && image.pixel(up) == act.rgb())
{
pixels.enqueue(up);
painter.drawPoint(up);
update();
}
QPoint down((newPoint.x()), (newPoint.y()+1));
if(down.y() > 0 && down.y() < image.height() && image.pixel(down) == act.rgb())
{
pixels.enqueue(down);
painter.drawPoint(down);
update();
}
}
}
}
Я вызываю эту функцию fill (…) внутри mousePressEvent здесь:
void drawingArea::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
lastPoint = event->pos();
QColor clr;
clr.fromRgb(image.pixel(lastPoint));
firstPoint = event->pos();
isDrawing = true;
if(isColorcheck) colorcheck(lastPoint);
if(isFill) fill(lastPoint,clr);
}
}
На самом деле не понимаю, как работает только черный цвет, когда передается аргумент QColor разных цветов.
Я был бы очень признателен за любую помощь или идеи.
Существует фундаментальная проблема с вашим кодом. Не делайте рисование из любого метода, вызываемого в вашем классе. Рисование должно быть сделано в обратном вызове события рисования, который вы определяете. QWidget :: paintEvent стоит исследовать
void MyClass::paintEvent(QPaintEvent *event)
{
// do the drawing depending on the context and you may
// define that context in other event handlers, etc.
}
Кроме этого, трудно сказать, что еще не так. Кстати, вы можете вызвать событие рисования с помощью repaint () или update (). Вы должны рассмотреть, как точная область перерисовки определяется в вашем коде.