769.50K
Категория: ПрограммированиеПрограммирование

Фильтры событий. Искусственное создание событий. Введение в компьютерную графику

1.

Фильтры событий.
Искусственное создание
событий.
Введение в компьютерную
графику

2.

Фильтры событий
Механизм перехвата событий, который
позволяет объекту фильтра просматривать
событие раньше объекта, которому они
предназначены и принимать решение –
обрабатывать их и\ или передавать дальше.
Установка фильтров происходит на уровне
объектов
Все получаемые события и их обработка
будут касаться только тех объектов, в
которых установлены фильтры
2

3.

Реализация фильтров событий
Нужно унаследовать класс QObject
Переопределить в нем метод eventFilter()
eventFilter ( param1, param2)
Указатель
на объект,
для которого
предназначено
событие
Указатель
на объект события
Возвращает true или false
3

4.

main.cpp
4

5.

5

6.

int main( int argc, char** argv)
{ QApplication app(argc, argv);
QLineEdit txt(„QLineEdit“);
txt. installEventFilter( new MouseFilter(&txt));
txt.show();
QLabel lbl(„QLabel“);
lbl.installEventFilter(new MouseFilter(&lbl));
lbl.show();
QPushButton cmd(„QPushButton“);
cmd.installEventFilter( new MouseFilter(&cmd));
cmd.show(); return app.exec(); }
6

7.

MouseFilter.h
7

8.

#ifndef _MouseFilter_h_
#define _MouseFilter_h_
#include <Qobject>
// =================================
class MouseFilter: public QObject {
protected: virtual bool eventFilter(QObject*,
QEvent*);
public:
MouseFilter(QObject* pobj=0);
};
8

9.

MouseFilter.cpp
9

10.

#include „MouseFilter.h“
#include<QtWidgets>
MouseFilter:: MouseFilter( QObject *pobj / *=0*/)
: QObject(pobj) { }
/*virtual*/ bool MouseFIlter :: eventFilter(QObject *
pobj, QEvent *pe)
{ if (pe→type() == QEvent:: MouseButtonPress){
if (static_cast<MouseEvent*>(pe)→button()==
Qt::LeftButton){
QString strClassName=pobj→metaObject()→
className();
QMessageBox::information(0, „ClassName“,
strClassName); return true; } } return false; }
10

11.

В объектах возможна установка нескольких
фильтров
Последний установленный фильтр будет
применяться первым
Есть возможность глобальной установки
фильтра событий, то есть фильтра, который
будет действовать на все объекты
приложения
Нужно вызвать метод installFilter() объекта
QcoreApplication() или метод QApplication()
11

12.

Искусственное создание событий
Компьютеры бесполезны. Они
могут только давать вам ответы.
Пикассо

13.

Генерация событий
QCoreApplication :: sendEvent(param1, param2)
QCoreApplication:: postEvent(param1, param2)
param 1 – указатель на объект, которому
посылается событие
param2 – адрес объекта события
13

14.

main.cpp
14

15.

#include<QtWidgets>
int main( int argc, char** arg)
{
QApplication app( argc,argv);
QLineEdit txt(„User input: “);
txt.show(); txt.resize( 280, 20);
int i;
for( i=0; i<Qt:: Key_Z- Qt:: Key_A+1;++i)
{ QChar ch=65+i;
int nKey= Qt::Key_A+i;
15

16.

QKeyEvent *pePress= new QKeyEvent(
QEvent::KeyPress, nKey, Qt::NoModifier, ch);
QApplication :: sendEvent(&txt, pePress);
QKeyEvent* peRelease= new QKeyEvent ::
KeyRelease,nKey, Qt::NoModifier, ch);
}
return app.exec();
}
16

17.

Симуляция нажатия мыши
17

18.

void mousePress( QWidget * pwgt, int x, int y,
Qt:: MouseButton bt= Qt::LeftButton,
Qt::MouseButton bts= Qt::LeftButton)
{
if (pwgt){
QMouseEvent *pePress= new QMouseEvent
(QEvent:: MouseButtonPress, QPoint (x,y), bt,
bts, Qt::NoModifier);
QApplication ::postEvent(pwgt, pePress);
}
}
18

19.

Модифицировать объекты
событий возможно не всегда
При совместном создании искусственных
событий с фильтрами можно осуществить
подмену самих объектов событий
Например, изменение назначения клавиш
клавиатуры
Класс события клавиатуры не обладает
методами, позволяющими его
модифицировать.
Каждое сообщение клавиатуры можно
получить в объекте фильтра и перед передачей
подменить его другим.
19

20.

main.cpp
20

21.

#include<QtWidgets>
#include „KeyFilter.h“
int main( in argc, char** argv)
{ QApplication app(argc, argv);
QLineEdit txt;
txt.show();
KeyFilter *pFilter=new keyFilter(&txt);
txt.installEventFilter(pFilter);
return app.exec() }
21

22.

KeyFilter.h
22

23.

#pragma once
#include<QtWidgets>
// ====================================
class KeyFilter: public QObject {
protected:
bool eventFilter (QObject *pobj, QEvent *pe)
{ if (pe→type()==QEvent::KeyPress){
if((QKeyEvent*)pe→key()==Qt::Key_Z){
QKeyEvent *pe=new KeyEvent (QEvent::KeyPress,
Qt::Key_A, Qt::NoModifier, „A“);
23

24.

QApplication:: sendEvent(&pobj, pe);
return true;
}
}
return false;
}
public: KeyFilter( QObject *pobj=0) :QObject(pobj)
{}
};
24

25.

Введение в компьютерную
графику
Точки, двумерные
размеры, прямоугольники,
линии, классы цветов

26.

Классы геометрии
Ничего не отображают на экране
Их назначение – задать расположение,
размер и описание формы объектов
26

27.

Точка QPoint, QPointF
(X, Y)
QPoint pt1(10,20);
QPoint pt2( 20,10);
QPoint pt3;
pt3=pt1+pt2;
pt3*=2;
27

28.

Точки
x(), y(), setX(), setY()
QPoint pt1(10,20);
pt1.x()+=10;
QPoint pt2(10,20);
QPoint pt3(10,20);
bool b1=(pt3= = pt2);
QPoint pt4(0,0);
bool b2= pt4.isNull ();
int n=pt1.manhattanLength();
28

29.

Двумерный размер QSize, QSizeF
Служат для хранения целочисленных или
вещественных размеров
Хранит две величины, над которыми можно
проводить операции сложения, вычитания,
умножения и деления
Есть операции сравнения ==, ! =, isNull()
width(), height(), setWidth(), setHeight()
29

30.

Двумерный размер QSize, QSizeF
rwidth(), rheight()
QSize size( 10,20);
int n=size.rwidth() ++;
scale(param1, param2, param 3);
Qt:: IgnoreAspectRatio
Qt:: KeepAspectRatio
Qt:: KeepAspectRatioByExpanding
30

31.

QSize.scale()
QSize size1(320,240);
size1.scale (400,600, Qt::IgnoreAspectRatio);
QSize size2 (320,240);
size2.scale (400,600, Qt:: KeepAspectRatio);
QSize size3 (320, 240);
size3.scale (400,600,
Qt::KeepAspectRatioByExpanding);
31

32.

32

33.

Прямоугольник QRect, QRectF
QPoint pt(10,20);
QSize size( 20,10);
QRect r(pt, size);
x(), y(), setX(), setY()
size(), width(), height(),
setSize(),
setWidth(),
setHeight()
33

34.

Отрезок QLine, QLineF
x1(), y1(), x2(), y2()
p1(), p2()
dx(), dy()
QLine line(10,10,30,20);
= =, != , isNull()
34

35.

Многоугольник QPolygon, QPolygonF
Фигура, представляющая собой замкнутую
ломаную линию
QVector <QPoint>,
QVector< QPointF>
QPolygon polygon;
polygon < < QPoint (10,20)
< < QPoint (20,10)
< < QPoint (30,30);
35

36.

Цвет, цветовая модель QColor
RGB (Red, Green, Blue)
RGBA (Red, Green, Blue, Alpha)
CMYK ( Cyan, Magenta, Yellow, Key color)
HSV ( Hue, Saturation, Value)
QColor позволяет сохранять цвета во всех
цветовых моделях
==, !=
36

37.

Цветовая модель RGB (аддитивная)
37

38.

RGB
QColor colorBlue (0,0,255,128);
red(), blue(), green(), alpha()
redF(), blueF(), greenF(), alphaF()
getRgb()
QColor color( 100,200,0);
int r,g,b;
color.getRgb( &r,&g,&b);
38

39.

RGB
set…
Структура данных QRgb
qRgb(), qRgba()
QRgb rgbBlue1= qRgba( 0,0,255,255);
QRgb
QRgb rgbBlue3= 0x000000FF;
qRed(), qGreen(), qBlue(), qAlpha()
rgbBlue2= qRgb( 0,0,255);
39

40.

RGB
QRgb rgbBlue=0x000000FF;
QColor colorBlue1( rgbBlue);
QColor colorBlue2;
colorBlue2.setRgb( rgbBlue);
rgb()
QColor colorBlue1 (“#0000FF“);
QColor colorBlue2;
colorBlue2. setNameColor( “#0000FF“);
40

41.

HSV ( оттенок, насыщенность,
значение)
Не смешивает основные цвета при
моделировании нового цвета, а изменяет их
свойства
Оттенок (Hue) – просто сам цвет
Насыщенность (Saturation) – наличие белого
цвета в оттенке
Значение (Value) определяет интенсивность
цвета. Цвет с высокой интенсивностью – яркий,
с низкой – темный
41

42.

HSV ( оттенок, насыщенность,
значение)
42

43.

HSV
QColor :: setHsv(), QColor:: setHsvF()
QColor color1;
color1. setHsv( 233, 100, 50);
getHsv(), getHsvF();
QColor color2 (100,200,0);
int h,s,v;
color2.getHsv( &h,&s,&v);
43

44.

CMYK (субтрактивная цветовая
модель: голубой, пурпурный, желтый,
черный)
44

45.

CMYK
В субтрактивной цветовой модели любой цвет –
три числа, каждое из которых указывает, какое
количество определенного цвета нужно вычесть
из белого.
Для получения черного цвета – нужно
использовать все три краски – голубую,
пурпурную и желтую.
QColor :: getCmyk(), getCmykF()
QColor:: setCmyk(), setCmykF()
45

46.

Палитра
Ограниченное количество цветовых
значений
Цветовое значение адресуется при помощи
индекса
46

47.

Предопределенные цвета
Представляют собой палитру из 17 констант
именованных цветов
47

48.

QColor:: lighter(), QColor:: darker()
QColor color=QColor( Qt:: red).darker(160);
48

49.

Задание
Запустить программы из презентации и
прислать скрины работы
49
English     Русский Правила