QT 4: программирование GUI на С++
Шрифт:
Когда пользователь нажимает кнопку мышки, система генерирует событие «клавиша мышки нажата» (mouse press). Путем переопределения функции QWidget::mousePressEvent мы можем обработать это событие и установить или стереть пиксель изображения, находящийся под курсором мышки.
Если
Функция mouseMoveEvent обрабатывает события «перемещение мышки». По умолчанию эти события генерируются только при нажатой пользователем кнопки мышки. Можно изменить этот режим работы с помощью вызова функции QWidget::setMouseTracking, но нам не нужно это делать в нашем примере.
Как при нажатии левой или правой кнопки мышки устанавливается или стирается пиксель, так и при удерживании нажатой кнопки над пикселем тоже будет устанавливаться или стираться пиксель. Поскольку допускается удерживать нажатыми одновременно несколько кнопок, возвращаемое функцией QMouseEvent::buttons значение представляет собой результат логической операции поразрядного ИЛИ для кнопок. Мы проверяем нажатие определенной кнопки при помощи оператора & и при наличии соответствующего состояния вызываем функцию setImagePixel.
Функция setImagePixel вызывается из mousePressEvent и mouseMoveEvent для установки или стирания пикселя. Параметр pos определяет положение мышки на виджете.
На первом этапе надо преобразовать положение мышки из системы координат виджета в систему координат изображения. Это достигается путем деления координат положения мышки x и y на коэффициент масштабирования. Затем мы проверяем попадание точки в нужную область. Это легко сделать при помощи функций QImage::rect и QRect::contains; фактически здесь проверяется попадание значения переменной i в промежуток между 0 и значением image.width — 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».
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
рейтинг книги
Его огонь горит для меня. Том 2
2. Мир Карастели
Фантастика:
юмористическая фантастика
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
рейтинг книги
Наследник
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
рейтинг книги
