TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 7 Tiedostonkäsittely ja asetukset Juha-Matti Vanhatupa
Sisältö Leikepöytä Asetusten tallentaminen (QSettings) Tietovirrat ja tiedostonkäsittely Undo/redo toiminnallisuus
QClipboard Kapseloi leikepöydän käytön Toteuttaa samat mekanismit datan käsittelyyn kuin QDrag Käyttö erilaista riippuen käyttöjärjestelmästä Esim MAC OS: find buffer
Datan asettaminen leikepöydälle settext() setpixmap() setmimedata() QClipboard *clipboard = QApplication::clipboard();
Datan lukeminen leikepöydältä text() image() mimedata() QClipboard *clipboard = QApplication::clipboard(); // Tyhjää leikepöytä clipboard->clear();
Clipboard - signaalit void datachanged () Kutsutaan kun data leikepöydällä muuttuu void changed ( QClipboard::Mode mode ) Kutsutaan kun kyseisen mode:n data leikepöydällä muuttuu enum QClipboard::Mode QClipboard::Clipboard QClipboard::Selection (X11) QClipboard::FindBuffer (Mac OS)
QSettings Abstrahoi sovellusasetusten tallentamisen: asetukset voidaan tallentaa alustariippumattomasti - Rekisteri (Windows) - Ini-tiedosto (Unix) - XML-tiedosto (Mac) Käyttää hyväkseen sovelluksen nimeä ja organisaation nimeä QCoreApplication::setOrganizationName("Joku_lafka"); QCoreApplication::setApplicationName("Huippusofta");
QSettings Tallentaa asetukset avain-arvo-pareina: (QString avain, QVariant arvo) value(), setvalue(), contains(), remove(), clear() Hierarkkisuus begingroup endgroup Soveltuu hyvin asetuksien säilömiseen, mutta ei tarkoitettu suurien datamäärien tallentamiseen
QSettings Esimerkki Widget::Widget(QWidget *parent){ QCoreApplication::setOrganizationName("Grako2013"); QCoreApplication::setApplicationName("esim_luento7"); QSettings settings; QVariant v = settings.value("mainwindow/pos",qvariant()); if(v.isvalid()){ QPoint p = v.topoint(); this->move(p); } } Widget::~Widget(){ QSettings settings; settings.setvalue("mainwindow/pos",pos()); delete ui; }
QFile Rajapinta tiedostoon lukemiselle ja kirjoittamiselle. Käyttää / tiedostoeroittimena huolimatta käyttöjärjestelmästä. Toteuttaa input/output rajapinnan QIODevice. Jäsenfunktioita: exists() remove() open() close() flush()
QFile esimerkki Qfile file( in.txt ); If (!file.open(qiodevice::readonly QIODevice::Text)) { return; } while(!file.atend()) { QString line = QString(file.readLine()); processline(line); }
QTextStream Tietovirta tekstin lukemiseen ja kirjoittamiseen 3 Tapaa lukea tekstiä kasa kerrallaan readline() tai readall() Sana kerrallaan >> operaattorilla Merkki kerrallaan >> operaattorilla Hoitaa tyyppimuunnokset automaattisesti Lisäksi funktioita tekstin asemointiin ja lukujen muotoiluun.
Tiedoston luku tietovirralla Qfile file( in.txt ); If (!file.open(qiodevice::readonly QIODevice::Text)) { return; } QTextStream in(&file); while(!in.atend()) { QString line = in.readline(); processline(line); }
Tiedoston kirjoitus tietovirralla Qfile file( in.txt ); If (!file.open(qiodevice::writeonly QIODevice::Text)) { } return; QTextStream out(&file); out << Tekstiä tiedostoon ja numero << 6 << \n ;
QDataStream Käyttöjärjestelmästä riippumaton binääriformaatti Toteuttaa C++:n perustietotyyppien sarjallistamisen. Monimutkaisempi data sarjallistetaan jakamalla se perustietotyypeiksi. Myös osaa Qt:n tietorakenteista: QList, QHash, QLinkedList, QVector ja QMap voidaan käyttää.
Virtaan kirjoittaminen QFile file("file.dat"); file.open(qiodevice::writeonly); QDataStream out(&file); out<<"kissoja on "; //merkkijonon serialisointi out << (qint32)7; //... ja kokonaisluku
Virrasta lukeminen QFile file("file.dat"); file.open(qiodevice::readonly); QDataStream in(&file); QString s; qint32 kissoja; in >> s >> kissoja;
Binääri- vai tekstiformaatti? Binääri Tehokkaampaa, kompaktimpaa Muutosherkkää Versiointi Versionumeron kovakoodaus DataStream::setVersion() Kryptisempää voi olla hyvä tai huono asia Teksti Selkokielistä Helposti muiden ohjelmien käytössä Helposti muokattavaa
Undo Redo Toteutusvaihtoehtoja 1)Tallennetaan ohjelman tila talteen jokaisen toiminnon yhteydessä Esim. sarjallistetaan muistiin QByteArray-oliona Helppoa, mutta hyvin tehotonta, käyttökelpoinen vain harvoissa tapauksissa 2) Pidetään kirjaa tehdyistä toiminnoista Command pattern Qt:n Undo framework
Undo framework Kaikki toiminnot suoritetaan komentoina, jotka tallennetaan undo-pinoon. Jokainen komento osaa peruuttaa itsensä, jolloin on mahdollista palata suorituksessa taaksepäin.
Undo framework QUndoCommand Kantaluokka undo-pinoon laitettaville komennoille QUndoStack Lista suoritetuista komennoista QUndoGroup Joukko undo-pinoja (erilliset pinot esim. erillisille avatuille dokumenteille, yksi aktiivinen pino) QUndoView Widgetti, joka näyttää undo-pinon sisällön ja antaa siirtyä pinossa.
Undo framework class AppendText : public QUndoCommand { public: AppendText(QString *doc, const QString &text) : m_document(doc), m_text(text) { settext("append text"); } virtual void undo() { m_document->chop(m_text.length()); } virtual void redo() { m_document->append(m_text); } private: QString *m_document; QString m_text; };
Undo framework MyCommand *command1 = new MyCommand(); stack->push(command1); MyCommand *command2 = new MyCommand(); stack->push(command2); stack->undo(); // poistaa command2:n pinosta MyCommand *command3 = new MyCommand(); stack->push(command3);