Menükezelés,sharedmemory,hash tábla,actiongroup

2011.04.03. 12:02 | arabiata | Szólj hozzá!

Címkék: hash tábla menükezelés sharedmemory actiongroup

  A sok elmélet után kezdjük el a kódolást. Két mysql táblára lesz szükségünk, felhasznalok és kornyezet. Kézzel felvittünk egy admin jogú felhasználót

insert into felhasznalok values ('admin','admin','admin','admin','igen')

 A mezőket nem soroltuk fel, mivel mindegyiket kitöltjük. Kell még a kornyezet táblába az ablakok_tetlen_ideje mező másodpercben:

insert into kornyezet (ablakok_tetlen_ideje) values ('120')

MainClass konstruktora:

MainClass::MainClass() : sh_mem("qt_labor") {

widget.setupUi(this);

if (sh_mem_init() == false) {

exit(-1);

}

if (db_init() == false) {

exit(-1);

}

if (hash_init() == false) {

exit(-1);

}

if (kornyezeti_valtozok_olvasasa() == false) {

exit(-1);

}

menucsoportok_init();

}

A következő függvényekben csak a lényeget emelem ki.

sh_mem_init:

if (sh_mem.create(10, QSharedMemory::ReadOnly) == false) {

QMessageBox::critical(0, "Hiba", trUtf8("Már fut a program."), QMessageBox::Ok);

sh_mem.detach();

return false;

Ha nem tudjuk lefoglalni a memória területet, már fut a program.

db_init:

#ifdef Q_OS_WIN

db_leiro = QSqlDatabase::addDatabase("QODBC");

#else

db_leiro = QSqlDatabase::addDatabase("QMYSQL");

#endif

Windows és linux alatt más a neve a mysql driver-nek.

 hash_init:

hash_tabla = NULL;

hash_tabla = new QHash<QString, QString>;

if (hash_tabla == NULL) {

QMessageBox::critical(0, "Hiba", trUtf8("Nem tudom létrehozni a hash táblát."), QMessageBox::Ok);

return false;

 Kulcs, érték QString típusu, dinamikus pointerként hozom létre.

Menükezelés:

A menüpontokat a qtdesigner-ben felvett action-ök alapján érem el. Vagy minden menüponthoz rendelek slot-ot connect utasítással, ami sok-sok signal,slot összerendelést jelent, vagy a menubar-hoz csinalok egy slot-ot, és azon belül switch segítségével haladok menüpontonként:

void MainClass::menuValaszto_slot(QAction *action) {

int menupont = action->objectName().mid(2).toInt();

switch (menupont) {

case 1: // felhasználó váltás, login, azert kell a {} mert a switch-en belül deklaráltam változót

{

felh->setEnabled(false);

validalo->setEnabled(false);

admin->setEnabled(true);

LoginForm *theForm = new LoginForm(db_leiro, hash_tabla);

theForm->exec();

delete theForm;

if (hash_tabla->value("login_ok") == "1") {

menuvalaszto(hash_tabla->value("szint").toInt());

felh_nev = hash_tabla->value("felh_nev");

nev = hash_tabla->value("nev");

szint = hash_tabla->value("szint");

}

hash_tabla->remove("login_ok");

hash_tabla->remove("felh_nev");

hash_tabla->remove("nev");

hash_tabla->remove("szint");

}

break;

case 2: // kilépés

close();

break; 

 Hash táblában a login során visszakapott infók vannak.

A menükezeléshez tartozik még a felhasználói szintenkénti menüpontok kezelése. Erre jó a QACtionGroup, ahol csoportokba foglalom a szintenként engedélyezett menüpontokat, és ezeket egyszerre tudom engedélyezni - letiltani.

 

void MainClass::menucsoportok_init() {

felh = new QActionGroup(this);

felh->addAction(widget.a_8);

felh->addAction(widget.a_9);

felh->addAction(widget.a_10);

 

validalo = new QActionGroup(this);

validalo->addAction(widget.a_7);

validalo->addAction(widget.a_8);

validalo->addAction(widget.a_9);

validalo->addAction(widget.a_10);

 

admin = new QActionGroup(this);

admin->addAction(widget.a_3);

admin->addAction(widget.a_4);

admin->addAction(widget.a_5);

admin->addAction(widget.a_6);

admin->addAction(widget.a_7);

admin->addAction(widget.a_8);

admin->addAction(widget.a_9);

admin->addAction(widget.a_10);

 

felh->setEnabled(false);

validalo->setEnabled(false);

admin->setEnabled(true);

 Az admin csak fejlesztés idejére true. Az utolsó három sor megtalálható a switch login részében is, hiszen nem tudom előre, hogy ki fog bejelentkezni.

Környezeti változók beolvasása:

 

bool MainClass::kornyezeti_valtozok_olvasasa() {

 

QSqlQuery query(db_leiro);

query.prepare("select ablakok_tetlen_ideje from kornyezet");

query.exec();

if (query.next() == false) {

QMessageBox::critical(0, "Hiba", trUtf8("select ablakok_tetlen_ideje from kornyezet"), QMessageBox::Ok);

return false;

}

 

hash_tabla->insert("tetlen_ido", query.value(0).toString());

 A leírásban van egy ilyen:

QSqlQuery query("SELECT * FROM artist"); 

  Na, ez nekem nem ment, ezért választottam a fenti megoldást. 

A bejegyzés trackback címe:

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

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