Similar presentations:
Фильтры событий. Искусственное создание событий. Введение в компьютерную графику
1.
Фильтры событий.Искусственное создание
событий.
Введение в компьютерную
графику
2.
Фильтры событийМеханизм перехвата событий, который
позволяет объекту фильтра просматривать
событие раньше объекта, которому они
предназначены и принимать решение –
обрабатывать их и\ или передавать дальше.
Установка фильтров происходит на уровне
объектов
Все получаемые события и их обработка
будут касаться только тех объектов, в
которых установлены фильтры
2
3.
Реализация фильтров событийНужно унаследовать класс QObject
Переопределить в нем метод eventFilter()
eventFilter ( param1, param2)
Указатель
на объект,
для которого
предназначено
событие
Указатель
на объект события
Возвращает true или false
3
4.
main.cpp4
5.
56.
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.h7
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.cpp9
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.cpp14
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.cpp20
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.h22
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, QSizeFrwidth(), 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.
3233.
Прямоугольник QRect, QRectFQPoint pt(10,20);
QSize size( 20,10);
QRect r(pt, size);
x(), y(), setX(), setY()
size(), width(), height(),
setSize(),
setWidth(),
setHeight()
33
34.
Отрезок QLine, QLineFx1(), 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.
Цвет, цветовая модель QColorRGB (Red, Green, Blue)
RGBA (Red, Green, Blue, Alpha)
CMYK ( Cyan, Magenta, Yellow, Key color)
HSV ( Hue, Saturation, Value)
QColor позволяет сохранять цвета во всех
цветовых моделях
==, !=
36
37.
Цветовая модель RGB (аддитивная)37
38.
RGBQColor 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.
RGBset…
Структура данных 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.
RGBQRgb 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.
HSVQColor :: 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