Eljött az idő, midőn olyan programot kell írni, amihez nem kell grafikus felület. Ehhez a következő lépések kellenek:
- sima C++ Qt application az indulás
- Create main file maradjon bejelölve
- létrejött egy db. main.cpp file
- Source files -> new -> c++ header file
- Project -> properties -> Qt
- QtGui nem kell, viszont QtSql igen (már, ha akarunk adatbázis kapcsolatot)
- a Profile résznél kivehetjük a Show profiling indicators kapcsolót
- a main.cpp elejéről kivesszük a #include <QtGui/QApplication> részt és a helyére tesszük ezt: #include <QtCore/QCoreApplication>
- a QApplication app(argc, argv);-t lecseréljük QCoreApplication a(argc, argv);-re
Most van egy üres header file, amit be kell forgatni a cpp-be. Viszont nincs semmi class, stb. deklaráció. A code template-eknél látható, hogy cls+tab egy új osztályt hoz létre.
#ifndef NEWFILE_H
#define NEWFILE_H
class Class {
public:
Class();
Class(const Class& orig);
virtual ~Class();
private:
};
#endif /* NEWFILE_H */
A "Class" helyére beírjuk az osztály nevét, amit a netbeans szépen behelyettesít. Ha bármilyen signal - slot kapcsolatot használni fogunk a programban, akkor a class osztálynév után írjuk be, hogy " : public QObject", majd új sorba: Q_OBJECT. Természetesen nem felejtjük el az #include <QObject>-et sem. Ha a majdani programnak csak egyszer kell lefutnia, a cpp végén az a.exec() helyére írjunk egy nullát.
Néhány finomság:
- timer, ütemezés
QBasicTimer itt nem használható, helyette QTimer kell. A beállított idő leteltét (timeout) egy connect utasítással tudjuk figyelni:
connect(hl7_timer, SIGNAL(timeout()), this, SLOT(hl7_timer_slot()));
A hl7_timer_slot egy mezei függvény. Ezzel az ütemezett futtatást le is tudtuk.
- file kezelés
Egy probléma jelentkezhet, ha a sor vég jel 0x0D = \r. Ezt nem hajlandó lekezelni a rendszer, így nem soronként olvassa be egy file tartalmát, hanem benyalja az egészet. Rémísztőnek hangzik, pedig nem az. Nekem egy 650 kb-os linux alatt megírt txt file-t csont nélkül betett egy QString változóba. A file deklarálásánál nem szabad megadni a QIODevice::Text-et, meg kell hagyni az alapértelmezett értéket. Csak így biztosítható, hogy a \r jelet ne gyomlálja ki a progi.
Megnyitjuk az olvasandó file-t:
QFile hl7_inp;
hl7_inp.setFileName("valami.txt");
hl7_inp.open(QIODevice::ReadOnly); <- itt nem kell megadni a QIODevice::Text-et
Beolvassuk a tartalmát:
QStringList sorok;
sorok.clear();
olv_sor.clear();
hl7_queue.clear();
QTextStream in(&hl7_inp);
olv_sor = in.readAll();
sorok = olv_sor.split("\r");
Az "olv_sor" változóba bekerül az egész tartalom, és innen átpakoljuk egy StringList-be, úgy, hogy "\r" karakter az elválasztó. Pl. az eredeti tartalom: elsosor\rmasodiksor, akkor a split után a sorok-ban már két bejegyzés lesz: elsosor masodiksor. sorok.count() = 2. Így már a sorok stringlist-ben bent van a file tartalma soronként. Egy for ciklussal végig is tudjuk pörgetni.
- string kezelés
Nézzük egy hl7 üzenet fejrészét, amibő ki kell vennünk a 6. és 9. rész tartalmát:
MSH|^~\&|SOBO||kklab2||201101050125||ORM^O01|2718043|P|2.3|||NE|AL|
Elkezdhetem ciklusban számolni a "|" karaktereket, substring-gel eldobni a nem kellő darabokat vagy
sor.enqueue(olv_sor.section("|", 9, 9)); // uzenet azonosito
sor.enqueue(olv_sor.section("|", 6, 6)); // uzenet kuldes ideje
Kicsit egyszerűbb:)
De mi a sor.enqueue? A kivágott részeket adatbázisba kell írni. Ehhez a szükséges adatokkal feltöltök egy FIFO tömböt, és ezt olvasom végig soronként ciklusban.
QSqlQuery query;
query.prepare("insert into rendelesek values(:a,:b,:c,:d,:e,:f,0)");
while (sor.isEmpty() == false) {
query.bindValue(i, sor.dequeue());
i++;
}
query.exec();
Legközelebb programok közti kommunikáció, IPC