bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

Hasonló dokumentumok
Widget-ünket a festők vásznáról Canvas-nak nevezzük el. Mit kell a widgetnek tudnia?

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

if(_param.antialias) painter.setrenderhint(qpainter::antialiasing, true);

Qt rajzolás munkafüzet. Elemi Alkalmazások fejlesztése 3.

Elemi alkalmazások fejlesztése III.

Programozás II gyakorlat. 4. Öröklődés

117. AA Megoldó Alfréd AA 117.

QT Grafika az alap alkalmazás (GrafikaQtvel) működése

Tervminták a valósidejű gyakorlatban

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C# osztályok. Krizsán Zoltán

Elemi grafika. Stílusok, időzítő, képek

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Elemi alkalmazások fejlesztése III.

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Elemi alkalmazások fejlesztése III.

Eseményvezérelt alkalmazások fejlesztése I 4. előadás. Elemi grafika és egérkezelés

3. Osztályok II. Programozás II

3D-s számítógépes geometria és alakzatrekonstrukció

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Képfájlok beolvasása és megjelenítése

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Elemi alkalmazások fejlesztése III.

Modell megvalósítása. Gregorics Tibor: Eseményvezérelt alkalmazások fejlesztése I.

Bevezetés a programozásba Előadás: A const

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

Eseménykezelés. Aszinkron kommunikáció

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 1. Szín, fény, textúra 2. Stencil buffer használata (tükörkép, hamis árnyék)

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

Virtuális függvények (late binding)

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Grafikus Qt programok írása segédeszközök nélkül

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 felhasználása számítógépes grafikában (bevezető egy primitív keretrendszer)

Programozás C++ -ban 2007/4

Programozás II gyakorlat. 6. Polimorfizmus

Algoritmusok és adatszerkezetek II.

Osztály és objektum fogalma

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

ISA szimulátor objektum-orientált modell (C++)

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

.AA Megoldó Alfréd AA.

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

Eseményvezérelt alkalmazások fejlesztése I 4. előadás. Elemi grafika és egérkezelés. Elemi grafika és egérkezelés Rajzolás grafikus felületen

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

VB C++ C# JScript J# Common Language Specification. ADO.NET and XML. Base Class Library. Common Language Runtime. Operating System

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

A keretrendszer. A linuxos keretrendszer az eredeti alapján készült (nagyrészt C++-ban), ezért nagyjából azzal azonos funkcionalitásokkal rendelkezik.

Konkurens TCP Szerver

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Elemi alkalmazások fejlesztése IV.

Felhasználó által definiált adattípus

OOP: Java 8.Gy: Abstract osztályok, interfészek

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

BME MOGI Gépészeti informatika 7.

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

Bevezetés a programozásba előadás: Öröklődés

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Java Programozás 1. Gy: Java alapok. Ismétlés ++

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Bevezetés a programozásba Előadás: Fordítási egység

4. Öröklődés. Programozás II

Szálkezelés Rajzolás képernyőre Bevitel kezelése - Érintő képernyő - Billentyűzet

Ugráló gomb oktatási segédlet Ugráló gomb

Elemi alkalmazások fejlesztése III.

Programozás I gyakorlat. 5. Struktúrák

Java és web programozás

Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

3D-s számítógépes geometria és alakzatrekonstrukció

Példa 30 14, 22 55,

Programozás I. Grafika Eseménykezelés. Programozás I. 2. gyakorlat Interakció a grafikus felületen, tagfüggvények. Surányi Márton PPKE-ITK

Információs Technológia

II. Programozási technológiák

Programozás II. ATM példa Dr. Iványi Péter

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Tartalomjegyzék. Bevezetés...2

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

OOP: Java 4.Gy: Java osztályok

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Szálkezelés Rajzolás képernyőre Bevitel kezelése - Érintő képernyő - Billentyűzet

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

Informatikai Kar. 4. fejezet. Giachetta Roberto

128. AA Megoldó Alfréd AA 128.

BME MOGI Gépészeti informatika 6.

F# (efsárp) példaprogramok

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

GRAFIKA PROGRAMOZÁSA OPTIMALIZÁLT MEGJELENÍTÉS ALAPJAI GYAKORLATI 2D GRAFIKA II. RÉSZ. Dr. Mileff Péter

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás - Memóriajáték 1/2

VISUAL BASIC ALAPISMERETEK

Átírás:

canvas.h #pragma once #include <QColor> #include <QImage> #include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QMouseEvent> #include <QRubberBand> // terület kiválasztáshoz struct RajzParameterek int penwidth = 1; Qt::PenStyle penstyle = Qt::SolidLine; Qt::PenCapStyle pencap = Qt::FlatCap; Qt::PenJoinStyle penjoin = Qt::MiterJoin; Qt::BrushStyle brushstyle = Qt::SolidPattern; QColor pencolor = qrgb(0, 0, 0), brushcolor = qrgb(255, 266, 255); ; class Canvas : public QWidget Q_OBJECT bool _modified = false; // ki kell rajzolni? bool _drawing = false; // szabadkézi rajzolás közben vagyunk? bool _freehand = false; // nem QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató QImage _canvas; RajzParameterek _param; // ide rajzolunk public: Canvas(QWidget *parent = 0); virtual ~Canvas() ; void SetParameters(RajzParameterek &param) _param = param; // Bármilyen képre jó, ha ez a _canvas, akkor a szülő méretére kell állítani! // Csak nagyobb newsize esetén változtatja meg a méretet void Resize(QImage *image, QSize newsize); void StartFreeHandDrawing() _freehand = true; void StopFreeHandDrawing() _freehand = false; // double buffer // lekérdezés bool IsModified() const return _modified; bool IsDrawing() const return _drawing; const QPoint &LastPos() const return _lastpoint; QColor GetPixel(const QPoint &pt) const return _canvas.pixel(pt); QColor PenColor() const return _param.pencolor; int PenWidth() const return _param.penwidth; Qt::PenStyle PenStyle() const return _param.penstyle;

Qt::PenCapStyle PenCapStyle() const return _param.pencap; Qt::PenJoinStyle PenJoinStyle()const return _param.penjoin; Qt::BrushStyle BrushStyle() const return _param.brushstyle; // Beállítás void SetPenWidth(int width) _param.penwidth = width; void SetPenColor(QColor color) _param.pencolor = color; void SetPenStyle (Qt::PenStyle &v) _param.penstyle= v; void SetPenCapStyle(Qt::PenCapStyle &v) _param.pencap= v; void SetPenJoinStyle(Qt::PenJoinStyle &v) _param.penjoin= v; void SetBrushStyle(Qt::BrushStyle &v) _param.brushstyle= v; // rajzolás void SetPixel(const QPoint &pt, QColor color); // egy pont kirajzolása void MoveTo(int x, int y) _lastpoint = QPoint(x, y); void DrawLine(const QPoint start, const QPoint end); void LineTo(const QPoint &endpoint); void DrawEllipse(const QRect &rect, bool fill = false); void DrawRect(const QRect & rect, bool fill = false); void DrawPolygon(const QVector<QPointF> points, bool fill = false); void DrawPolygon(const QPoint & pt, double sidelength, int sidecount, bool fill = false); void DrawTriangle(const QPoint & pt, double side, bool fill = false); // void DrawArc(double start, double end); void Clear(); protected: // esemányek. Q_DECL_OVERRIDE == C++ override identifier () // elhagyható lenne, de jó ha van (ellenőrzi, hogy valóban virtuális fv-t írtunk felül) #if QT_VERSION < 0x050000 // akkor nincs Q_DECL_OVERRIDE definiálva #define Q_DECL_OVERRIDE #endif void resizeevent(qresizeevent *event) Q_DECL_OVERRIDE; void mousepressevent(qmouseevent *event) Q_DECL_OVERRIDE; void mousemoveevent(qmouseevent *event) Q_DECL_OVERRIDE; void mousereleaseevent(qmouseevent *event) Q_DECL_OVERRIDE; void paintevent(qpaintevent *event) Q_DECL_OVERRIDE; ;

canvas.cpp #include "canvas.h" #include <cmath> Canvas::Canvas(QWidget *parent) : QWidget(parent) void Canvas::Resize(QImage *image, QSize newsize) if (newsize.width() < image->width()) newsize.setwidth(image->width()); if (newsize.height() < image->height()) newsize.setheight(image->height()); if (newsize.width() == image->width() && newsize.height() == image->height()) return; QImage newimage(newsize, QImage::Format_RGB32); newimage.fill(qrgb(255, 255, 255)); QPainter painter(&newimage); painter.drawimage(qpoint(0, 0), *image); *image = newimage; void Canvas::resizeEvent(QResizeEvent *event) int newwidth = qmax(width() + 128, _canvas.width()); int newheight = qmax(height() + 128, _canvas.height()); Resize(&_canvas, QSize(newWidth, newheight)); QWidget::resizeEvent(event); // a kirajzolás itt történik: _canvas-t rajzoljuk ki a képernyőre void Canvas::paintEvent(QPaintEvent *event) QPainter painter(this); QRect dirtyrect = event->rect(); painter.drawimage(dirtyrect, _canvas, dirtyrect); void Canvas::Clear() _canvas.fill(qrgb(255, 255, 255)); _lastpoint = QPoint(0, 0); update(); void Canvas::SetPixel(const QPoint &pt, QColor color) _canvas.setpixel(pt, color.rgb()); _lastpoint = pt; update(); // single point void Canvas::DrawLine(const QPoint start, const QPoint end)

_lastpoint = start; LineTo(end); void Canvas::LineTo(const QPoint &endpoint) painter.drawline(_lastpoint, endpoint); update(qrect(_lastpoint, endpoint).normalized().adjusted(-rad, -rad, +rad, +rad)); _lastpoint = endpoint; void Canvas::DrawEllipse(const QRect &rect, bool fill) if (fill) painter.setbrush(qbrush(_param.brushcolor, _param.brushstyle)); painter.drawellipse(rect); update(rect.normalized().adjusted(-rad, -rad, +rad, +rad)); void Canvas::DrawRect(const QRect & rect, bool fill) if (fill) painter.fillrect(rect, QBrush(_param.brushColor, _param.brushstyle)); else painter.drawrect(rect); update(rect.normalized().adjusted(-rad, -rad, +rad, +rad)); void Canvas::DrawPolygon(const QVector<QPointF> points, bool fill) if (points.size() < 3 points.size() > 100) // értelmes korlát a lehetséges pontokra

return; if (fill) painter.setbrush(qbrush(_param.brushcolor, _param.brushstyle)); painter.drawpolygon( points.data(), points.size() ); double minx = 10000, maxx = -10000, miny = 10000, maxy = -10000; for (int i = 0; i < points.size(); ++i) if (minx > points[i].x()) minx = points[i].x(); if (maxx < points[i].x()) maxx = points[i].x(); if (miny > points[i].y()) miny = points[i].y(); if (maxy < points[i].y()) maxy = points[i].y(); QRect rect = QRect(minx, miny, maxx, maxy); update(rect.normalized().adjusted(-rad, -rad, +rad, +rad)); void Canvas::DrawPolygon(const QPoint & pt, double sidelength, int sidecount, bool fill) if (sidecount < 3 sidecount > 100) // értelmes korlát a lehetséges oldalszámra return; szög QVector<QPointF> points(sidecount); double angle = 2 * 3.1415926535897931159979634685442 / sidecount, // középponti r = sidelength / sin(angle/2) / 2; // beírható kör sugara _lastpoint = pt; const_cast<qpoint&>(pt) += QPoint(0, r); // középpont double x, y; for (int i = 0; i < sidecount; ++i) x = pt.x() - r * sin(i*angle); y = pt.y() - r * cos(i*angle); points[i] = QPointF(x, y); DrawPolygon(points, fill); void Canvas::DrawTriangle(const QPoint & pt, double side, bool fill) QVector<QPointF> points; points.push_back(pt); double d = side * 1.7320508075688771931766041234368 / 2.0; QPoint qp; qp.setx(pt.x() + side / 2.0); qp.sety(pt.y() + d); points.push_back(qp); qp.setx(pt.x() - side / 2.0); points.push_back(qp);

DrawPolygon(points, fill); void Canvas::mousePressEvent(QMouseEvent *event) if (event->button() == Qt::LeftButton) _lastpoint = event->pos(); if(_freehand) _drawing = true; void Canvas::mouseMoveEvent(QMouseEvent *event) if (_drawing) LineTo(event->pos()); void Canvas::mouseReleaseEvent(QMouseEvent *event) if (_drawing & event->button() == Qt::LeftButton) LineTo(event->pos()); _lastpoint = event->pos(); _drawing = false;