Console application

2011.05.17. 13:59 | arabiata | Szólj hozzá!

Címkék: osztály class console application fifo qfile qtextstream

 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

A bejegyzés trackback címe:

https://qtqt.blog.hu/api/trackback/id/tr362911037

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása