Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Август 25, 2013, 18:48



Название: [РЕШЕНО] QPainter. Нарисовать шахматную сетку.
Отправлено: gil9red от Август 25, 2013, 18:48
Всем привет! :)
Написал алгоритм рисования и возникает артефакт (второй рисунок "Зебра").
Возникает он иногда при изменении размеров окна.
В чем ошибка? :)

Код:
Код:
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing);

    int sizeCell = 15;

    QColor color1 = Qt::gray;
    QColor color2 = Qt::white;

    painter.setPen(Qt::NoPen);

    bool brush = true;

    for(int row = 0; row < width(); row+=sizeCell)
        for(int column = 0; column < height(); column+=sizeCell)
        {
            if(brush)
                painter.setBrush(color1);
            else
                painter.setBrush(color2);

            painter.drawRect(row, column, sizeCell, sizeCell);

            brush = !brush;
        }
}


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: Kurles от Август 25, 2013, 20:49
А  где артефакт? :)


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: gil9red от Август 25, 2013, 20:55
Артефакт на втором рисунке, возникает при изменении размеров окна, причем не всегда, а на определенных размеров


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: _OLEGator_ от Август 25, 2013, 22:32
Я полагаю это не артефакт. Надо более внимательно относиться к коду - не достаточно менять brush на противоположное значение.
Ты идешь по Y координате с шагом 15, постоянно меняя brush. Что будет когда в высоту помещается четное количество шагов? Что будет, когда нечетное количество шагов?


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: Igors от Август 26, 2013, 10:03
Код
C++ (Qt)
           if ((row % 2) == (column % 2))
               painter.setBrush(color1);
           else
               painter.setBrush(color2);
 


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: Old от Август 26, 2013, 10:09
Думаете заработает это в коде gil9red?

Код
C++ (Qt)
           if ((row * column + column) & 1)
               painter.setBrush(color1);
           else
               painter.setBrush(color2);
 


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: Igors от Август 26, 2013, 10:27
Думаете заработает это в коде gil9red?
Подправил  :)


Название: Re: QPainter. Нарисовать шахматную сетку.
Отправлено: gil9red от Август 26, 2013, 12:05
Понял, спасибо за то что ткнули в ошибку и показали как ее исправить :)