Chiarimento classe



  • Ho Creato una classe semplice chiamata IMPOSTAZIONI con membri QString e int costanti. Ho creato una classe QDialog ASSEGNAMENTO per passare in fase di costruzione i valori da assegnare a IMPOSTAZIONI, solo che questo non si può fare perchè mi dice che la classe IMPOSTAZIONI dovrebbe essere modificata in una QWIDGET type. Come posso correggere questo errore cercando di mantenere la QDIALOG assegnamento come un oggetto dinamico ?



  • Molto vago. Puoi postare il codice delle 2 classi?



  • #include "basedati.h"
    #include <QSqlError>
    
    BaseDati::BaseDati(const QString &nomeDataBase,
                       const QString &nomeUtente,
                       const QString &password,
                       const QString &percorsoDatabase,
                       int porta)
    {
        mDb = QSqlDatabase::addDatabase("QMYSQL");
        mDb.setDatabaseName(nomeDataBase);
        mDb.setUserName(nomeUtente);
        mDb.setPassword(password);
        mDb.setHostName(percorsoDatabase);
        mDb.setPort(porta);
    
    }
    
    BaseDati::BaseDati()
    {
        _fis= new Fis (this);
        _fis->show();
        _fis->exec();
        mDb = QSqlDatabase::addDatabase("QMYSQL");
        mDb.setDatabaseName(_fis->restituzioneNome());
        mDb.setUserName(_fis->restituzioneUtente());
        mDb.setPassword(_fis->restituzionePassword());
        mDb.setHostName(_fis->restituzionePath());
        mDb.setPort(_fis->restituzionePorta());
    }
    
    
    
    bool BaseDati::inizializzaConnessione(QString &messaggioDiErrore)
    {
        if (!mDb.open()){
            messaggioDiErrore=mDb.lastError().text();
            return false;
        }
        return true;
    }
    
    #ifndef BASEDATI_H
    #define BASEDATI_H
    
    #include <QSqlDatabase>
    #include "fis.h"
    
    
    class BaseDati
    {
    public:
        BaseDati(const QString &nomeDataBase,
                 const QString &nomeUtente,
                 const QString &password,
                 const QString &percorsoDatabase,
                 int porta);
        bool inizializzaConnessione(QString &messaggioDiErrore);
        BaseDati::BaseDati();
    
    private:
        QSqlDatabase mDb;
         Fis *_fis;
    
    };
    
    #endif // BASEDATI_H
    
    
    #ifndef FIS_H
    #define FIS_H
    
    #include <QDialog>
    #include "fis.h"
    
    
    namespace Ui {
    class Fis;
    }
    
    class Fis : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Fis(QWidget *parent = 0);
        ~Fis();
       const QString restituzioneNome();
       const QString restituzioneUtente();
       const QString restituzionePassword();
       const QString restituzionePath();
       const int restituzionePorta();
    private:
        Ui::Fis *ui;
    
    
    };
    
    #endif // FIS_H
    
    #include "fis.h"
    #include "ui_fis.h"
    
    Fis::Fis(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Fis)
    {
        ui->setupUi(this);
    }
    
    Fis::~Fis()
    {
        delete ui;
    }
    
    QString Fis::restituzioneNome()
    {
      return ui->nomeDat->text();
    }
    
    QString Fis::restituzioneUtente()
    {
        return ui->utenteDat->text();
    }
    
    QString Fis::restituzionePassword()
    {
        return ui->passwordDat->text();
    }
    
    QString Fis::restituzionePath()
    {
        return ui->pathDat->text();
    }
    
    int Fis::restituzionePorta()
    {
        return ui->portadat->text().toInt();
    }
    
    

    Basedati è la classe in cui vorrei inserire i valori e per questo ho costruito un secondo costruttore in modo da poterli inserire.
    La classe Fis è la classe QDialog che dovrebbe permettermi di dare loro dei valori.
    MA quando lancio la compilazione mi esce

    ..\ProgettoDataBaseRicercaLavoro\basedati.cpp(21): error C2664: 'Fis::Fis(const Fis &)': impossibile convertire l'argomento 1 da 'BaseDati *const ' a 'QWidget *'
    


  • Ah ho capito il problema ma non la soluzione
    Creando l'elemento Fis lui si aspetta che io passi al costruttore un puntatore di un oggetto padre che deve essere un qwidget, ma la mia custom class non lo è.
    Quindi come risolvo l'equivoco?



    1. non usare mai QSqlDatabase come membro di una classe
      da http://doc.qt.io/qt-5/qsqldatabase.html:

    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.

    1. Fis::Fis(const Fis &) stai tentando di copiare un QDialog?
    2. Perche' stai tentando di chamare Fis::Fis(BaseDati*)?


  • 1 ok
    2-3 no vorrei aprire un QDialog inserire i valori per l'accesso ad un databese e quindi memorizzarli in nell'oggetto QSQLDatabase membro della classe basedati



  • sotto a

    private:
        Ui::Fis *ui;
    

    aggiungi: BaseDati m_baseDati;

    Poi in qt creator cliccaci su col destro->refactor->create getter and setter e assicurati che siano nella zona public

    ora ti basta chiamare Fis::setBaseDati per passare i valori a Fis



  • Dimmi se ho fatto bene o male.
    Ho bypassato la classe basedati eliminandola. Ho spostato l'oggetto QSqlDatabase come membro nella classe mainWindow del programma (l'oggetto si chiama mDb), ho aggiunto la voce "accedi al Database" ai menu , gli ho aggiunto il relativo slot di triggered, e infine ho messo nello slot questo codice:

    void MainWindow::on_actionAccedi_al_Database_triggered()
    {
        Fis f(this);
        f.exec();
        mDb = QSqlDatabase::addDatabase("QMYSQL");
        mDb.setDatabaseName(f.restituzioneNome());
        mDb.setUserName(f.restituzioneUtente());
        mDb.setPassword(f.restituzionePassword());
        mDb.setHostName(f.restituzionePath());
        mDb.setPort(f.restituzionePorta());
    }
    

    Ho visto che accede al database, ovviamente era quello che mi interessava prima di iniziare a raffinare il codice.



  • @Polly said in Chiarimento classe:

    Ho spostato l'oggetto QSqlDatabase come membro nella classe mainWindow del programma

    @VRonin said in Chiarimento classe:

    non usare mai QSqlDatabase come membro di una classe



  • ooook grazie mille


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.