Planned maintenance has been done but it did not solve the problem. So work will continue on this and a new time for trying updates will be announced asap.

acquisire valore attributo di altra classe



  • Buongiorno,
    Scusate l'ignoranza è il primo anno che lavoro con QT/QML/QWEBENGINE e C++.
    Nel mio progetto istanzio la classe DataBase e imposto un suo attributo pubblico in main.cpp.

    	DataBase *database = new DataBase;
    	if (database->checkDataBase(path_and_name_db)) {
    		database->pippo= database->connectToDataBase(type_db, path_and_name_db, driver_db, . . ., "nome_connessione");
    	}
    
    

    Dichiarazione public in classe DataBase:

     QSqlDatabase pippo;
    QSqlDatabase connectToDataBase(int type_db, QString path_and_name_db, QString driver_db, . . ., QString conn_name );
    

    Come posso acquisire DataBase::pippo con il valore impostato nella main se sono in un'altra classe ?

    Ovviamente ho provato varie possibilità senza successo prima di chiedere al forum.
    Grazie Grazie Grazie Grazie Grazie


  • Qt Champions 2018

    Buongiorno!
    La risposta e' semplice ma purtroppo devo anche segnalare che quello che sta facendo e' sbagliato.

    Da https://doc.qt.io/qt-5/qsqldatabase.html#details

    Warning: It is highly recommended that you do not keep a copy of the QSqlDatabase around as a member of a class, as this will prevent the instance from being correctly cleaned up on shutdown. If you need to access an existing QSqlDatabase, it should be accessed with database(). If you chose to have a QSqlDatabase member variable, this needs to be deleted before the QCoreApplication instance is deleted, otherwise it may lead to undefined behavior.

    Quindi QSqlDatabase pippo; va cancellato e basta chiamare QSqlDatabase::addDatabase passando "pippo" come secondo argomento. Da li' in poi basta chamare QSqlDatabase::database("pippo") per recuperarlo ovunque nel programma.



  • @VRonin said in acquisire valore attributo di altra classe:

    QSqlDatabase::database("pippo")

    Buongiorno,
    La ringrazio per la sua risposta. in pratica lo facevo già, solo che portavo su un altro ogetto che suavo nel metodo in qui utilizzavo la connessione e questo mi ha spinto a pensare ce fosse meglio usare un solo oggetto nel progetto.

    Codice attuale:

    		QSqlDatabase pippo= QSqlDatabase::database("dbpippo");
    		QSqlDatabase pluto= QSqlDatabase::database(dbpluto);
    		QSqlQuery querypippo(pippo);
    		QSqlQuery querypluto(pluto);
    

    In pratica basa fare :

    		QSqlQuery querypippo(QSqlDatabase::database("dbpippo"));
    		QSqlQuery querypluto(QSqlDatabase::database(dbpluto));
    

    Mantenere il codice attuale, porta via molte risorse? Conviene modificarlo seguendo la soluzione più corretta?


  • Qt Champions 2018

    codice attuale:
    QSqlDatabase pippo= QSqlDatabase::database("dbpippo");

    Quasi. Il problema e' che il vero codice attuale e':

    DataBase *database = new DataBase;
    database->pippo=QSqlDatabase::database("dbpippo");
    

    Cioe' pippo non e' una variabile locale allocata sullo stack ma un membro di un oggetto allocato a memoria dinamica. Se ti dimentichi di chamare delete sudatabase o lo chiami troppo tardi crei problemi al programma. Usare una variabile locale chiamando QSqlDatabase pippo= QSqlDatabase::database("dbpippo"); tutte le volte che ti serve e' perfettamente valido e sicuro



  • Grazie delle delucidazioni


Log in to reply