20 int zoomFactor() const { return zoom; }

Класс IconEditor использует макрос Q_PROPERTY() для объявления трех пользовательских свойств: penColor, iconImage и zoomFactor. Каждое свойство имеет тип данных, функцию «чтения» и необязательную функцию «записи». Например, свойство penColor имеет тип QColor и может считываться и записываться при помощи функций penColor() и setPenColor().

Когда мы используем виджет в Qt Designer, пользовательские свойства появляются в редакторе свойств Qt Designer ниже свойств, унаследованных от QWidget. Свойства могут иметь любой тип, поддерживаемый QVariant. Макрос Q_OBJECT необходим для классов, в которых определяются свойства.

21 protected:

22 void mousePressEvent(QMouseEvent *event);

23 void mouseMoveEvent(QMouseEvent *event);

24 void paintEvent(QPaintEvent *event);

25 private:

26 void setImagePixel(const QPoint &pos, bool opaque);

27 QRect pixelRect(int i, int j) const;

28 QColor curColor;

29 QImage image;

30 int zoom;

31 };

32 #endif

IconEditor переопределяет три защищенные функции QWidget и имеет несколько закрытых функций и переменных. В трех закрытых переменных содержатся значения трех свойств.

Файл реализации класса начинается с конструктора IconEditor:

01 #include

02 #include "iconeditor.h"

03 IconEditor::IconEditor(QWidget *parent)

04 : QWidget(parent)

05 {

06 setAttribute(Qt::WA_StaticContents);

07 setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

08 curColor = Qt::black;

09 zoom = 8;

10 image = QImage(16, 16, QImage::Format_ARGB32);

11 image.fill(qRgba(0, 0, 0, 0));

12 }

В конструкторе имеется несколько тонких моментов, связанных с применением атрибута Qt::WA_StaticContents и вызовом функции setSizePolicy(). Вскоре мы обсудим их.

Устанавливается черный цвет пера. Коэффициент масштабирования изображения (zoom factor) устанавливается на 8, то есть каждый пиксель пиктограммы представляется квадратом 8 × 8.

Данные пиктограммы хранятся в переменной—члене image, и доступ к ним может осуществляться при помощи функций setIconImage() и iconImage(). Программа редактирования пиктограмм обычно вызывает функцию setIconImage() при открытии пользователем файла пиктограммы и функцию iconImage() для считывания пиктограммы из памяти, когда пользователь хочет ее сохранить. Переменная image имеет тип QImage. Мы инициализируем ее областью в 16 × 16 пикселей и на 32-битовый формат ARGB, который поддерживает полупрозрачность. Мы очищаем данные изображения, устанавливая признак прозрачности.

Способ хранения изображения в классе QImage не зависит от оборудования. При этом его глубина может устанавливаться на 1, 8 или 32 бита. Изображения с 32-битовой глубиной используют по 8 бит на красный, зеленый и синий компоненты пикселя. В остальных 8 битах хранится альфа—компонент пикселя (уровень его прозрачности). Например, компоненты красный, зеленый и синий «чистого» красного цвета и альфа—компонент имеют значения 255, 0, 0 и 255. В Qt этот цвет можно задавать так:

QRgb red = qRgba(255, 0, 0, 255);

или так (поскольку этот цвет непрозрачен):

QRgb red = qRgb(255, 0, 0);

Тип QRgb просто синоним типа unsigned int, созданный с помощью директивы typedef, a qRgb() и qRgba() являются встроенными функциями (то есть со спецификатором inline), которые преобразуют свои аргументы в 32-битовое целое число. Допускается также запись

QRgb red = 0xFFFF0000;

где первые FF соответствуют альфа—компоненту, а вторые FF — красному компоненту. В конструкторе класса IconEditor мы делаем QImage прозрачным, используя 0 в качестве значения альфа—компонента.

Перейти на страницу:

Похожие книги