Elmosás (antialias) 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); bool antialias = false;
if(_param.antialias) painter.setrenderhint(qpainter::antialiasing, true);
signals: void LastPosChanged(QMouseEvent *); Mi a signal? #define signals public Hova rakjuk be? void Canvas::mouseReleaseEvent(QMouseEvent *event) if (_drawing & event->button() == Qt::LeftButton) LineTo(event->pos());// minimum 1 pont legyen kirajzolva _drawing = false; // elmentjük az utolsó pontot _lastpoint = event->pos(); // majd elküldjük a SIGNAL-t, hátha kell valakinek... // itt kapja meg a paramétert // a MOC lecseréli ezt a sort a C++ fordító elől emit LastPosChanged(event);
Egér események: void mousepressevent(qmouseevent *event) Q_DECL_OVERRIDE; void mousemoveevent(qmouseevent *event) Q_DECL_OVERRIDE; void mousereleaseevent(qmouseevent *event) Q_DECL_OVERRIDE; állapotok lekérdezése: a QMouseEvent-ből: Qt::MouseButton event->button() QList<Qt::MouseButton> event->buttons() QPoint pos() QPoint globalpos() - Nem ugyanaz, mint a QPoint maptoglobal( pos() ) Akkor használjuk, ha pl. az egérrel elmozdítjuk a widget-et. Qt::KeyboardModifiers event->modifiers() const A lehetséges módosító gombok: Egyik ilyen gomb sem Bármelyik SHIFT Bármelyik CTRL Bármelyik ALT A Windows gomb A numerikus billentyűzet egy gombja, valamelyik nyíl, stb Csak X11 alatt Qt::NoModifier Qt::ShiftModifier Qt::ControlModifier Qt::AltModifier Qt::MetaModifier Qt::KeypadModifier Qt::GroupSwitchModifier
Lépések: 1. Töltsük le a tanszéki szerverről (www.fat.bme.hu/updownload/download.php) a GrafikaQTvel.7z, sinus.txt, cosinus.txt és CSAK Windows alatt a 7z1604-x64.exe fájlokat 2. Windows - Futtassuk le a 7z1604-x64.exe telepítőt 3. Windows - Indítsuk el a 7zfm fájl menedzsert 4. Windows - Válasszuk ki a GrafikaQTvel.7z fájlt és bontsuk ki a tartalmát egy megfelelő helyre. Mozgassuk a forrásfájlok mellé a két txt fájlt Linux parancssor - 7z x GrafikaQTvel.7z [-o<ahova ki akarjuk bontani>] 5. Indítsuk el a QT Creator-t vagy a Visual Studio-t 6. Fordítsuk le és futtassuk a projektet, hogy minden rendben van-e
7. Így kell kinéznie 8. 9. Lépjünk ki a programból 10. Adjuk hozzá a projekthez a qcustomplot.cpp és qcustomplot.h fájlokat 11. Ezután kapcsoljunk át a jobb oldali stckpages 1. lapjára (eddig a neve pnlright volt). Nevezzük át pnlgraph-ra! Adjunk ehhez hozzá egy widgetet, amit nevezzük át plotter-re. A pnlgraph elrendezését állítsuk be pl. vízszintesre, hogy a plotter teljes lapot kitöltse. 12. Léptessük elő (Promote to ) a graph widgetet QCustomPlot-ra 13. Kattintsunk a bal oldalon a Grafikon fejlécre 14. Mentsük el a változtatást 15. Adjuk hozzá a #include "qcustomplot.h" sort a grafikaqtvel.cpp fájlhoz 16. Módosítsuk a grafikaqtvel.cpp fájlban az on_tbxmenu_currentchanged(int index) függvényt! index == 1 esetén kapcsoljon át az 1-es lapra 17. QT Creatorral fordítás esetén módosítsuk a projekt fájlban a QT += sort QT += widgets gui printsupport ra 18. Ellenőrizzük működik-e. Fájl beolvasás: meg van írva csak a GUI-hoz kell kapcsolni 19. adjuk hozzá a grafikaqtvel.h-hoz a btnbrowse1 gomb clicked SIGNALjához tartozó SLOT-ot void on_btnbrowse1_clicked(); 20. Válasszuk ki az stckpages widgetet. Állítsuk át a btnplot és a btnprint gombokat inaktívra töröljük ki a kijelölést a Property Editorban ezek enabled jelölőnégyzetéből! Mentsük el a változtatásokat!
Adjuk hozzá a SLOT függvényt a grafikaqtvel.cpp fájlhoz! void GrafikaQTvel::on_btnBrowse1_clicked() QString filename = QFileDialog::getOpenFileName(this, "Adat fájl megnyitása", "./", "ASCII fájlok (*.txt);;bináris fájlok (*.)"); if (!filename.isempty()) // volt létező fájl név ui.edtfile1->settext(filename); Kirajzolás 21. A kirajzolás gomb csak akkor aktív, ha létező fájl név van a beviteli mezőben. Deklaráljuk a.h fájlban és készítsük el a.cpp fájlban a SLOT-ját. A függvény: void GrafikaQTvel::on_edtFile1_textChanged(QString s) bool benable =!s.isempty()&& QFile::exists(s); ui.btnplot->setenabled(benable); A függvényt a Kirajzolás (btnplot) megnyomására olvassuk be és rajzoltatjuk ki. A SLOT definíciója (a deklarációról se feledkezzünk meg!) void GrafikaQTvel::on_btnPlot_clicked() QVector <double> x, y; if (_ReadFile(ui.edtFile1->text(), x, y) > 0) // * egyébként hiba QCPGraph *graph = ui.plotter->addgraph(); plotter->setdata(x, y); // ** ui.plotter->replot(); // *** 22. Fordítsuk le és futtassuk a programot! Mi a probléma a megjelenítéssel? 23. A *** sor elé szúrjuk be a következőket: double minx = 9.0e99, miny = 9.0e00, maxx=-9.0e99, maxy=-9.0e99; for (int i = 0; i < x.size(); ++i) if (minx > x[i]) minx = x[i]; if (miny > y[i]) miny = y[i]; if (maxx < x[i]) maxx = x[i]; if (maxy < y[i]) maxy = y[i]; ui.plotter->xaxis->setrange(minx, maxx);
ui.plotter->yaxis->setrange(miny, maxy); Ezután már a várt képet kapjuk: 24. a GrafikaQTvel konstruktorába írjuk be: ui.plotter->setinteractions(qcp::irangedrag QCP::iRangeZoom); Feliratozzuk a tengelyeket: ui.plotter->xaxis->setlabel("time (sec)"); ui.plotter->yaxis->setlabel("signal (V)"); 25. Vonal stílus és ábrák. A ** sor elé: graph->setlinestyle(qcpgraph::lsnone); graph->setscatterstyle(qcpscatterstyle::ssdisc); A pontok összefolynak, csak belenagyítva látható, hogy kis korongok 26. Kommentezzük ki a most beírt két sort 27. Ha több fájlt jelenítünk meg, mindegyik bent marad a memóriában. Használjuk az Adat felülírása jelölőnégyzetet a bent levők kitörlésére! A * sor elé szúrjuk be: if (ui.chkoverwrite1->ischecked()) while (ui.plotter->graph(0)) ui.plotter->removegraph(0); 28. Adjunk hozzá konstruktorban a setinteractions() hoz egy újabbat bitet, a QCP::iSelectPlottables ami lehetővé teszi egy görbe kiválasztását:: ui.plotter->setinteractions(qcp::irangedrag QCP::iRangeZoom QCP::iSelectPlottables); 29. Módosítsuk a kódot úgy, hogy minden függvénygörbéhez adjuk hozzá a fájl nevét és adjunk egy jelölőnégyzetet a laphoz, amelyik megmutatja/eltünteti a jelmagyarázatot! A ** sor elé szúrjuk be: graph->setname(ui.edtfile1->text()); Adjunk hozzá két jelölőnégyzetet az UI-hoz 1. Nevük legyen chkscatter és chklegend! 1 Az egyszerűség kedvéért a hozzáadás előtt szüntessük meg a layout-ot (Break Layout).
Az elsőhöz nem kell SLOT, elég beírni a kikommentezett graph->setscatterstyle(qcpscatterstyle::ssdisc); sor elé a vizsgálatát: if (ui.chkscatter->ischecked()) graph->setscatterstyle(qcpscatterstyle::ssdisc); 30. A jelmagyarázathoz csináljuk meg a void on_chklegend_toggled(bool); SIGNAL-t: void GrafikaQTvel::on_chkLegend_toggled(bool b) ui.plotter->legend->setvisible(b); ui.plotter->replot();