Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Когда под рукой нет подходящих виджетов Qt и когда нельзя получить желаемый результат, комбинируя и адаптируя существующие виджеты, мы можем все же создать требуемый виджет. Это достигается путем создания подкласса QWidget и переопределением обработчиков некоторых событий, связанных с рисованием виджета и реагированием на щелчки мышки. При таком подходе мы свободно можем определять и управлять как внешним видом, так и режимом работы нашего виджета. Такие встроенные в Qt виджеты, как QLabel, QPushButton и QTableWidget, реализованы именно так. Если бы их не было в Qt, все же можно было бы

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

Для демонстрации данного подхода при написании пользовательского виджета мы создадим виджет IconEditor, показанный на рис. 5.2. Виджет IconEditor может использоваться в программе редактирования пиктограмм.

Рис. 5.2. Виджет IconEditor.

Сначала рассмотрим заголовочный файл.

01 #ifndef ICONEDITOR_H

02 #define ICONEDITOR_H

03 #include <QColor>

04 #include <QImage>

05 #include <QWidget>

06 class IconEditor : public QWidget

07 {

08 Q_OBJECT

09 Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)

10 Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)

11 Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)

12 public:

13 IconEditor(QWidget *parent = 0);

14 void setPenColor(const QColor &newColor);

15 QColor penColor const { return curColor; }

16 void setIconImage(const QImage &newImage);

17 QImage iconImage const { return image; }

18 QSize sizeHint const;

19 void setZoomFactor(int newZoom);

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 <QtGui>

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 этот цвет можно задавать так:

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4