void IconEditor::setImagePixel(const QPoint &pos, bool opaque) {

int i = pos.x() / zoom; int j = pos.yO / zoom;

if (image.rect().contains(i, j)) { if (opaque) {

image.setPixel(i, j, penColor().rgba()); } else {

image.setPixel(i, j, qRgba(0, 0, 0, 0));

}

update(pixelRect(i, j));

}

}

Функция setImagePixel() вызывается из mousePressEventO и mouseMoveEventO для установки или стирания пикселя. Параметр pos определяет положение мышки на виджете.

На первом этапе надо преобразовать положение мышки из системы координат виджета в систему координат изображения. Это достигается путем деления коорди­нат положения мышки х() и у() на коэффициент масштабирования. Затем мы прове­ряем попадание точки в нужную область. Это легко сделать при помощи функций Qlmage:: rect() и QRect:: contains(); фактически здесь проверяется попадание значе­ния переменной i в промежуток между 0 и значением image. width() - 1, а перемен­ной j - в промежуток между 0 и значением image, height() - 1.

В зависимости от значения параметра opaque мы устанавливаем или стираем пиксель в изображении. При стирании пиксель фактически становится прозрачным. Для вызова Qlmage: :setPixel() мы должны преобразовать перо QColor в 32-битовое значение ARGB. В конце мы вызываем функцию update() с передачей объекта QRect, задающего область перерисовки.

Теперь, когда уже рассмотрены функции-члены, мы вернемся к используемому в конструкторе атрибуту Qt:: WA_StaticContents. Этот атрибут указывает Qt на то, что содержимое виджета не изменяется при изменении его размеров и что его верхний левый угол остается на прежнем месте. Qt использует эту информацию, чтобы лишний раз не перерисовывать при изменении размеров виджета уже видимые его области.

Обычно при изменении размеров виджета Qt генерирует событие рисования для всей видимой области виджета. Но если виджет создается с установленным флаж­ком Qt::WA_StaticContents, область рисования ограничивается не показанными ра­нее пикселями. Это подразумевает, что, если размеры виджета уменьшаются, собы­тие рисования вообще не будет сгенерировано.


Рис. 5.5. Изменение размеров виджета Qt: :WA_StaticContents

Теперь виджет IconEditor полностью построен. На основе применения приводи­мых в предыдущих главах сведений и примеров мы можем написать программу, в ко­торой виджет IconEditor будет сам являться окном, использоваться в качестве цент­рального виджета в главном окне QMainWindow, в качестве дочернего виджета менед­жера компоновки или в качестве дочернего виджета объекта QScroll Area. В следующем разделе мы рассмотрим способы его интеграции в Qt Designer.


<< назад вперед >>