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.