Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obiekt klasy

Ostatnio zmodyfikowano 2017-12-19 10:27
Autor Wiadomość
Garniturek
Temat założony przez niniejszego użytkownika
Obiekt klasy
» 2017-12-18 20:04:01
Dzień dobry,

w klasie cWorker stworzono wskaźnik na obiekt klasy cSingIn. Kiedy użytkownik wejdzie w "Zaloguj się" i poprawnie wypełni dane logowania wraca na stronę główną aplikacji, gdzie może wypożyczyć książkę. Tutaj jest problem, ponieważ instrukcja warunkowa if(_cSignIn->get_signed()) sprawdzająca czy użytkownik jest zalogowany nie przepuszcza dalej działania programu, mimo, iż w poprzednim okienku użytkownik zalogował się i zmienił wartość zmiennej _signed na true. Wskaźnik na obiekt klasy cSignIn ma cały czas wartości zadeklarowane przed konstruktor domyślny. Stąd pytanie, w jaki sposób powinienem przesłać do klasy cWorker dane klasy cSignIn, aby w razie zalogowania można obsłużyć użytkownika?

#c++ #QtCreator

C/C++
cSignIn::cSignIn( QWidget * parent )
    : QDialog( parent )
     , ui( new Ui::cSignIn )
{
    ui->setupUi( this );
    _db.setHostName( "localhost" );
    _db.setDatabaseName( "biblioteka" );
    _db.setUserName( "root" );
    _db.setPassword( "" );
    connect( this->ui->pushButton, SIGNAL( clicked( bool ) ), this, SLOT( onOk() ) );
    connect( this->ui->pushButton_cancel, SIGNAL( clicked( bool ) ), this, SLOT( onCancel() ) );
    _signed = 0;
    idStudent = 0;
}

void cSignIn::onOk() //po kliknieciu buttona "OK"
{
    if( !_db.open() )
    {
        QMessageBox msgBox;
        msgBox.setText( "Błąd: nie można się połączyć z bazą!" );
        msgBox.exec();
    }
    else
    {
        QSqlQuery query;
        query.exec( "SELECT * FROM uzytkownicy" );
       
        while( query.next() )
        {
            if( ui->lineEdit_UserName->text() == query.value( 1 ).toString() && ui->lineEdit_Password->text() == query.value( 2 ).toString() )
            {
                _signed = 1;
                idStudent = query.value( 0 ).toInt();
                qDebug() << "idStudent: " << idStudent;
            }
        }
        _db.close();
        if( _signed == 0 )
        {
            QMessageBox msgBox;
            msgBox.setText( "Zły login lub hasło" );
            msgBox.exec();
        }
        else
        {
            close();
        }
       
    }
}

cWorker::cWorker()
    : _cSignIn( new cSignIn )
{
    db.setHostName( "localhost" );
    db.setDatabaseName( "biblioteka" );
    db.setUserName( "root" );
    db.setPassword( "" );
}

void cWorker::rent( QString id ) //wypozycz
{
    if( _cSignIn->get_signed() )
    {
        if( !db.open() )
        {
            QMessageBox msgBox;
            msgBox.setText( "Błąd: nie można się połączyć z bazą!" );
            msgBox.exec();
        }
        else
        {
           
            QSqlQuery query;
            query.exec( "UPDATE ksiazki SET StatusWypozyczenia = 1 WHERE id =" + id + "" ); //QString::number(_id)
            // pobieranie.prepare("DELETE FROM ksiazki WHERE id = "+QString::number(_id)+"");
            //  pobieranie.bindValue("id", 1);
            //  pobieranie.exec(); SLUZY DO USUWANIA KSIAZKI Z BAZY DANYCH
            QSqlQuery query2;
            qDebug() << _cSignIn->idStudent;
            query2.exec( "INSERT INTO Wypozyczenia (idUcznia, idKsiazki) VALUES (" + QString::number( _cSignIn->idStudent ) + "," + id + " )" );
            qDebug() << _cSignIn->idStudent;
            db.close();
        }
    }
    else
    {
        QMessageBox msgBox;
        msgBox.setText( "Zaloguj się!" );
        msgBox.exec();
    }
}
P-167979
darko202
» 2017-12-19 10:27:00
1.
Trudno jest zrozumieć problem, bo widać kawałek z kodu klasy
ale nie widać kodu programu, w którym występuje opisywany problem.
Opis odnosi się do kodu, którego nie widzimy

przydałby się przynajmniej nagłówek klas które używasz
tak to jest wiele możliwości 

2.
Widząc metodę    cSignIn::cSignIn
zastanawiam się gdzie ustawiasz, że połączyłeś się z bazą

poza tym patrząc na polecenie connect z
https://dev.mysql.com/doc​/connector-cpp/en​/connector-cpp-examples-connecting.html
spodziewałbym się czegoś do
sql::Connection::isValid() checks whether the connection is alive
i potem zapamiętania tego faktu w obiekcie

// ? nie wiem dlaczego wybrałem mySQL - może jest to inna baza i podobna funkconalność

3.
w
cSignIn::onOk()
sprawdzasz czy udało się połączyć z bazą
 if( !_db.open() )

jestem przekonany, że po wykonaniu connect można już zadawać zapytania
? robisz to bo nie uwzględniasz (? chyba) czy wykonałeś connect
czyli co się faktycznie dzieje ? -  ponownie łączysz się z bazą ?

3.
skoro chcesz sprawdzić czy użytkownik jest w bazie
chyba prościej byłoby wykonać
* query.exec( "SELECT * FROM użytkownicy WHERE user=... AND password = .... " );
* sprawdzić ile rekordów zwróciło powyższe zapytanie
* sprawdzenie QSqlQuery::isNull

http://doc.qt.io/qt-5​/qsqlquery.html#QSqlQuery

4.
>> w jaki sposób powinienem przesłać do klasy cWorker dane klasy cSignIn
* możesz skorzystać z funkcji zaprzyjaźnionej
http://cpp0x.pl/kursy​/Programowanie-obiektowe-C++​/Podstawy/Przyjazn/501
https://www.google.pl/search​?ei=3sM4WsjvEovWwAKe7qH4BQ​&q=c%2B%2B+klasy+funkcje+zaprz​yja%C5%BAnione​&oq=c%2B%2B+class+funkcje+z​&gs_l=psy-ab.3.0.0i22i30k1.5489035.5497966.0.5500845.17.16.1.0.0.0.231.1736.9j5j2.16.0....0...1.1.64.psy-ab..0.15.1607...0j0i67k1j0i22i10i30k1j0i13k1j0i13i30k1j33i22i29i30k1.0.Ns7vgxOSfb0

* możesz też napisać  funkcję w klasie A  biorącą za argument funkcję w klasie B
np.
C/C++
bool KlasaA::PolaczonoZBaza( klasaB kb )
{
    if(...)
         return true;
    else
         return false;
   
}
[ cpp ]
P-167989
« 1 »
  Strona 1 z 1