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.
<< назад вперед >>