Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. Chiarimento classe

Chiarimento classe

Scheduled Pinned Locked Moved Solved Italian
10 Posts 2 Posters 1.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • PollyP Offline
    PollyP Offline
    Polly
    wrote on last edited by
    #1

    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 ?

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2

      Molto vago. Puoi postare il codice delle 2 classi?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • PollyP Offline
        PollyP Offline
        Polly
        wrote on last edited by
        #3
        #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 *'
        
        1 Reply Last reply
        0
        • PollyP Offline
          PollyP Offline
          Polly
          wrote on last edited by
          #4

          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 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #5
            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*)?

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            1 Reply Last reply
            0
            • PollyP Offline
              PollyP Offline
              Polly
              wrote on last edited by
              #6

              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

              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by
                #7

                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

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                0
                • PollyP Offline
                  PollyP Offline
                  Polly
                  wrote on last edited by Polly
                  #8

                  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.

                  VRoninV 1 Reply Last reply
                  1
                  • PollyP Polly

                    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.

                    VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by
                    #9

                    @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

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    1 Reply Last reply
                    1
                    • PollyP Offline
                      PollyP Offline
                      Polly
                      wrote on last edited by
                      #10

                      ooook grazie mille

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved