Жасмин Бланшет - QT 4: программирование GUI на С++ Страница 30

Тут можно читать бесплатно Жасмин Бланшет - QT 4: программирование GUI на С++. Жанр: Компьютеры и Интернет / Программирование, год -. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте FullBooks.club (Фулбукс) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Жасмин Бланшет - QT 4: программирование GUI на С++

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту pbn.book@yandex.ru для удаления материала


Жасмин Бланшет - QT 4: программирование GUI на С++ краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «Жасмин Бланшет - QT 4: программирование GUI на С++» бесплатно полную версию:
Единственное официальное руководстро по практическому программированию в среде Qt 4.1.Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D. Авторы вооружают читателей беспрецедентно глубокими знаниями модели событий и системы компоновки Qt.На реалистических примерах они описывают высокоэффективные методы во всех областях — от разработки основных элементов графического пользовательского интерфейса до передовых методов интеграции с базой данных и XML. Каждая глава содержит полностью обновленный материал.Данное издание:• Включает новые главы по архитектуре Qt 4 модель/представление и поддержке подключаемых модулей Qt, а также краткое введение в программирование встроенных систем на платформе Qtopia.• Раскрывает все основные принципы программирования в среде Qt — от создания диалоговых и других окон до реализации функциональности приложений.• Знакомит с передовыми методами управления компоновкой виджетов и обработкой событий.• Показывает, как можно с наибольшей эффективностью использовать новые программные интерфейсы Qt 4, в частности мощный графический процессор 2D и новые простые в применении классы—контейнеры.• Представляет передовые методы Qt 4, которых нет ни в одной книге: от создания подключаемых модулей, расширяющих возможности Qt, и приложений, до применения «родных» для конкретной платформы программных интерфейсов.• Содержит приложение с подробным введением в программирование на С++ в среде Qt для опытных Java—разработчиков.Жасмин Бланшет (Jasmine Blanchette) — менеджер по документированию и старший разработчик компании «Trolltech» с 2001 года. Он является редактором «Qt Quarterly», информационного бюллетеня компании «Trolltech», и соавтором книги «Qt 3: программирование GUI на С++».Марк Саммерфилд (Mark Summerfield) — независимый преподаватель и консультант по С++, Qt и Python. Он работал менеджером по документированию в компании «Trolltech» на протяжении трех лет. Марк является соавтором книги «Qt 3: программирование GUI на С++».

Жасмин Бланшет - QT 4: программирование GUI на С++ читать онлайн бесплатно

Жасмин Бланшет - QT 4: программирование GUI на С++ - читать книгу онлайн бесплатно, автор Жасмин Бланшет

80 void IconEditor::mouseMoveEvent(QMouseEvent *event)

81 {

82 if (event->buttons() & Qt::LeftButton) {

83 setImagePixel(event->pos(), true);

84 } else if (event->buttons() & Qt::RightButton) {

85 setImagePixel(event->pos(), false);

86 }

87 }

Функция mouseMoveEvent() обрабатывает события «перемещение мышки». По умолчанию эти события генерируются только при нажатой пользователем кнопки мышки. Можно изменить этот режим работы с помощью вызова функции QWidget::setMouseTracking(), но нам не нужно это делать в нашем примере.

Как при нажатии левой или правой кнопки мышки устанавливается или стирается пиксель, так и при удерживании нажатой кнопки над пикселем тоже будет устанавливаться или стираться пиксель. Поскольку допускается удерживать нажатыми одновременно несколько кнопок, возвращаемое функцией QMouseEvent::buttons() значение представляет собой результат логической операции поразрядного ИЛИ для кнопок. Мы проверяем нажатие определенной кнопки при помощи оператора & и при наличии соответствующего состояния вызываем функцию setImagePixel().

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

89 {

90 int i = pos.x() / zoom;

91 int j = pos.y() / zoom;

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

93 if (opaque) {

94 image.setPixel(i, j, penColor().rgba());

95 } else {

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

97 }

98 update(pixelRect(i, j));

99 }

100 }

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

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

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

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

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

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

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

Интеграция пользовательских виджетов в Qt Designer

Прежде чем мы сможем использовать пользовательские виджеты в Qt Designer, мы должны сделать так, что Qt Designer будет знать о них. Для этого существует два способа: метод «продвижения» (promotion) и метод подключения (plugin).

Метод продвижения является самым быстрым и самым простым. Он заключается в выборе некоторого встроенного виджета Qt, программный интерфейс которого похож на программный интерфейс пользовательского виджета, и заполнении полей диалогового окна в Qt Designer некоторыми данными о пользовательском виджете. Впоследствии этот виджет может использоваться в формах, разработанных с помощью Qt Designer, но при редактировании или просмотре он отображается просто в виде выбранного встроенного виджета Qt.

Ниже приводится порядок действий при интеграции данным методом виджета HexSpinBox:

1. Создайте наборный счетчик QSpinBox, перетаскивая его с панели виджетов Qt Designer на форму.

2. Щелкните правой клавишей мышки по наборному счетчику и выберите пункт контекстного меню Promote to Custom Widget (Преобразовать в пользовательский виджет).

3. Заполните в появившемся диалоговом окне поле названия класса значением «HexSpinBox» и поле заголовочного файла значением «hexspinbox.h».

Вот и все! Сгенерированный компилятором uic программный код будет содержать оператор #include hexspinbox.h вместо <QSpinBox> и будет инстанцировать HexSpinBox. В Qt Designer виджет HexSpinBox будет представлен виджетом QSpinBox, позволяя нам устанавливать любые свойства QSpinBox (например, допустимый диапазон значений и текущее значение).

Рис. 5.6. Диалоговое окно для создания пользовательских виджетов Qt Designer.

Недостатками метода продвижения являются недоступность в Qt Designer свойств, характерных для пользовательского виджета, и то, что пользовательский виджет представляется в QtDesigner не своим изображением. Обе эти проблемы могут быть решены при применении метода подключения.

Метод подключения требует создания библиотеки подключаемых модулей, которую Qt Designer может загружать во время выполнения и использовать для создания экземпляров виджетов. В этом случае при редактировании формы и ее просмотре в Qt Designer будет использован реальный виджет, и благодаря мета—объектной системе Qt можно динамически получать список его свойств в Qt Designer. Для демонстрации этого метода мы с его помощью выполним интеграцию редактора пиктограмм IconEditor, описанного в предыдущем разделе.

Во-первых, мы должны создать подкласс QDesignerCustomWidgetInterface и переопределить несколько виртуальных функций. Мы предположим, что исходный файл подключаемого модуля расположен в каталоге с именем iconeditorplugin, а исходный текст программы IconEditor расположен в параллельном каталоге с именем iconeditor.

Ниже приводится определение класса:

01 #include <QDesignerCustomWidgetInterface>

02 class IconEditorPlugin : public QObject,

03 public QDesignerCustomWidgetInterface

04 {

05 Q_OBJECT

06 Q_INTERFACES(QDesignerCustomWidgetInterface)

07 public:

08 IconEditorPlugin(QObject *parent = 0);

09 QString name() const;

10 QString includeFile() const;

11 QString group() const;

12 QIcon icon() const;

13 QString toolTip() const;

14 QString whatsThis() const;

15 bool isContainer() const;

16 QWidget *createWidget(QWidget *parent);

17 };

Подкласс IconEditorPlugin является фабрикой класса (factory class), который инкапсулирует виджет IconEditor. Он является наследником классов QObject и QDesignerCustomWidgetIterface и использует макрос Q_INTERFACES(), указывая компилятору moc на то, что второй базовый класс представляет собой подключаемый интерфейс. Его функции применяются Qt Designer для создания экземпляров класса и получения информации о нем.

01 IconEditorPlugin::IconEditorPlugin(QObject *parent)

02 : QObject(parent)

03 {

04 }

IconEditorPlugin имеет тривиальный конструктор.

05 QString IconEditorPlugin::name() const

06 {

07 return "IconEditor";

08 }

Функция name() возвращает имя подключаемого виджета.

09 QString IconEditorPlugin::includeFile() const

10 {

11 return "iconeditor.h";

12 }

Функция includeFile() возвращает имя заголовочного файла для заданного виджета, который инкапсулирован в подключаемом модуле. Заголовочный файл включается в программный код, сгенерированный компилятором uic.

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.