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 ?
-
#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 *'
-
- 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.
Fis::Fis(const Fis &)
stai tentando di copiare unQDialog
?- Perche' stai tentando di chamare
Fis::Fis(BaseDati*)
?
- non usare mai
-
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