Функция Fill в базовом графическом приложении в Qt

0

Я создаю базовую графическую программу (например, MS Paint) с простым графическим интерфейсом. У меня есть два класса, где один - MainWindow, который содержит все кнопки, слайдеры и т.д., А второй класс - это настраиваемый виджет под названием drawingArea, на который пользователь может рисовать. В основном я реализовал большинство функций, но, к сожалению, я использовал функцию заполнения, которая должна работать точно так же, как в MS Paint. Я решил использовать так называемый алгоритм floodFill и после нескольких часов боев (я новичок в Qt) мне удалось заставить его работать. Но совсем нет. Проблема в том, что я могу заполнять только черные области (фигуры, линии, точки и т.д.) С выбранным цветом. Но когда дело доходит до заполнения разных цветов, оно просто помещает один пиксель в выбранный цвет. В funcion fill (...) ниже я передаю два аргумента - point (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 разных цветов. Я бы очень признателен за любую помощь или идеи.

Теги:
qt
graphics
qcolor
flood-fill

1 ответ

2

Существует серьезная проблема с вашим кодом. Не делайте рисунок из любого метода, вызванного в вашем классе. Чертеж должен выполняться в обратном вызове события рисования, который вы определяете. 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.
}

Помимо этого трудно сказать, что еще не так. BTW, вы можете вызвать событие рисования путем repaint() или update(). Вам нужно подумать о том, как в вашем коде определена точная область перерисовки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню