0

I am trying to implement the flood-fill algorithm, which requires on each iteration to get the color of point in an area. But the color of the selected point is always the background color even if I have drawn something.

void MainWindow::floodFill(QPainter& p, int x, int y, const QColor& cu, const QColor& cc) {

   st.push(QPair<int, int>(x, y)); 

   //used for debug
   int _r, _g, _b;
   int _rCu, _gCu, _bCu;
   int _rCc, _gCc, _bCc; 
   cu.getRgb(&_rCu, &_gCu, &_bCu);
   cc.getRgb(&_rCc, &_gCc, &_bCc);

   while (!st.isEmpty()) {
      QPair<int, int> pair = st.pop();
      QPixmap qPix = ui->centralWidget->grab();
      QImage image(qPix.toImage());
      QColor c(image.pixel(pair.first, pair.second));

      //used for debug, here QColor c is always the same
      c.getRgb(&_r, &_g, &_b);

      if (c == cu || c == cc) {
         continue;
      }
      p.setPen(cu);
      p.drawPoint(pair.first, pair.second);


      if (pair.first > 0) {
         st.push(QPair<int, int>(pair.first - 1, pair.second));
      }
      if (pair.first < 200/*ui->centralWidget->width()*/) {
         st.push(QPair<int, int>(pair.first + 1, pair.second));
      }
      if (pair.second > 0) {
         st.push(QPair<int, int>(pair.first, pair.second - 1));
      }
      if (pair.second < 200/*ui->centralWidget->height()*/) {
         st.push(QPair<int, int>(pair.first, pair.second + 1));
      }
   }
}

this is what i call in paint event

void MainWindow::paintEvent(QPaintEvent* event) {
   QPainter p(this);
   QColor colorRed(255, 0, 0);
   QColor colorBlack(0, 0, 0);

   p.setPen(QPen(colorBlack));

   p.drawRect(50, 50, 3, 3);


   floodFill(p, 51, 51, colorRed, colorBlack);
}
rednefed
  • 71
  • 2
  • 11
  • 2
    I think `p.drawRect(50, 50, 3, 3);` draws just an outline and not a filled rectangle. Color of pixel (51, 51) is just a background color. – vahancho Apr 11 '18 at 07:35
  • well yeah, but i want to fill the rectangle with the color red, the issue is that even the pixels of the rectangle outline are returned as the background color even though they should be black – rednefed Apr 11 '18 at 07:41
  • To fill the rectangle you need to set a brash. Something like `p.setBrush(Qt::red);` before drawing the rectangle. You need also check the correctness of coordinates in `floodFill` function. – vahancho Apr 11 '18 at 07:56

0 Answers0