Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2015, 11:40   #1
_Санек_
Пользователь
 
Регистрация: 02.09.2010
Сообщений: 52
По умолчанию Заливка по щелчку мыши

Помогите, пожалуйста. Что не так делаю? Создал класс paintwidget наследник QWidget(сам проект во вложении). Хочу сделать простую заливку сплошной области(наподобие floodFill в делфи).
Реализовал отрисовку:

Код:
void PaintWidget::paintEvent(QPaintEvent *event)
{
    QPainter pnt(this);
    QRect dirtyRect = event->rect();
    pnt.drawImage(dirtyRect, image, dirtyRect);
}
 
void PaintWidget::mousePressEvent(QMouseEvent *event)
{
    if ( event->button() == Qt::LeftButton )
    {
 
        MP1=event->pos();
        isDrawing=true;
        if (ActiveTool==7) // если активный инструмент заливка
        {
            QColor oldClr, newClr;
            oldClr=image.pixel(MP1);
            newClr=myBrush.color();
            //Fill(oldClr, newClr, MP2);
            Fill2(oldClr.rgb(), newClr.rgb(), MP1.x(), MP1.y());
            update();
 
        }
    }
event->accept();
}
Вот заполнение(первое заполнение взял из http://algolist.manual.ru/graphics/fill.php#mbib4
второе из http://www.cyberforum.ru/qt/thread1216341.html)

Код:
void PaintWidget::Fill(QColor oldClr, QColor newClr, QPoint p)
{
    QPainter pnt(&image);
    pnt.setPen(QPen(newClr));
    if (image.pixel(p) == oldClr.rgb() &&
          image.pixel(p) != newClr.rgb() )
       {
          pnt.drawPoint(p);
          Fill(oldClr,newClr,QPoint(p.x()+1,p.y()));
          Fill(oldClr,newClr,QPoint(p.x(),p.y()+1));
          Fill(oldClr,newClr,QPoint(p.x()-1,p.y()));
          Fill(oldClr,newClr,QPoint(p.x(),p.y()-1));
       }
    update();
}
 
void PaintWidget::Fill2(QRgb oldColor, QRgb newColor, int x, int y)
{
    if (oldColor == newColor) return;
 
            QStack<QPoint> stk;
            QPoint pt;
 
            int y1;
            bool spanLeft, spanRight;
 
            stk.push(QPoint(x, y));
 
            while (!stk.empty()) {
                pt = stk.pop();
                x = pt.x();
                y = pt.y();
                y1 = y;
                while (y1 >= 0 && image.pixel(x, y1) == oldColor) y1--;
                y1++;
 
                spanLeft = spanRight = false;
                while (y1 < image.height() && image.pixel(x, y1) == oldColor) {
                    image.setPixel(x, y1, newColor);
                    if (!spanLeft && x > 0 && image.pixel(x-1, y1) == oldColor) {
                        stk.push(QPoint(x-1, y1));
                        spanLeft = true;
                    } else if(spanLeft && x > 0 && image.pixel(x-1, y1) != oldColor) {
                        spanLeft = false;
                    }
                    if (!spanRight && x < (image.width() - 1) && image.pixel(x+1, y1) == oldColor) {
                        stk.push(QPoint(x+1, y1));
                        spanRight = true;
                    } else if(spanRight && (x < image.width() - 1) && image.pixel(x+1, y1) != oldColor) {
                        spanRight = false;
                    }
                    y1++;
                }
            }
}
Вложения
Тип файла: rar project.rar (179.3 Кб, 7 просмотров)
_Санек_ вне форума Ответить с цитированием
Старый 13.12.2015, 10:50   #2
_Санек_
Пользователь
 
Регистрация: 02.09.2010
Сообщений: 52
По умолчанию

Заливка Fill2 работает
_Санек_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2D библиотека для КОМПАС на Delphi. Как реализовать получение координат по щелчку мыши в поле? hmelevskih93 Помощь студентам 0 06.10.2015 11:06
Как сделать выполнение событий по щелчку мыши? Микура Visual C++ 4 15.12.2011 21:41
Сортировка по щелчку на столбец palochka БД в Delphi 2 23.05.2010 21:04
[Delphi]Перемещение компонента к щелчку мыши. Fiery Fox Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 07.03.2010 10:01
Движение объекта на форме по щелчку мыши Dux Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 08.12.2008 06:35