2017-09-18 3 views
0

Je crée une application qt simple pour fournir des détails et se connecter à l'application et récupérer des détails de la base de données. Elle a principalement 2 formes (MainWindow et Dialog) écrit pour obtenir une connexion à la base de données! J'ai utilisé la classe DBconnection pour me connecter à l'application en donnant des détails via le formulaire MainWindow! mais je ne sais pas comment conserver la connexion que j'ai ouverte dans le formulaire MainWindow et l'utiliser pour récupérer les données dans la tableview dans le formulaire Dialog.Création d'une connexion base de données commune pour les formulaires sévaral en utilisant qt C++

mycode est la suivante

DBconnection.h (travaillant avec succès)

public: 
     QSqlDatabase mydb; 
     bool connOpen(QString uname,QString pword,QString ip,int port,QString dbname){ 
      mydb=QSqlDatabase::addDatabase("QOCI","MyDB"); 
      mydb.setUserName(uname); 
      mydb.setPassword(pword); 
      mydb.setHostName(ip); 
      mydb.setPort(port); 
      mydb.setDatabaseName(dbname); 
      mydb.open(); 
      return true; 

     } 

mainwindow.cpp (travaillant avec succès)

void MainWindow::on_pushButton_clicked() 
    { 
     DBconnection con; 
     if(con.connOpen(ui->lineEdit->text(),ui->lineEdit_2->text(),ui->lineEdit_3->text(),ui->lineEdit_4->text().toInt(),ui->lineEdit_5->text())){ 
      Dialog dialog1; 

      dialog1.setModal(true); 
      dialog1.exec(); 

     } 
    } 

Dialog.cpp (ne fonctionne pas)Comment puis-je ajuster mon code afin de pouvoir récupérer des données dans le widget de table sous forme de dialogue à partir de la connexion que j'ai faite à partir du formulaire MainWindow?

+0

Je pense que vous êtes à la recherche de ce https://docstore.mik.ua/orelly/linux/sql/ch13_02.htm Vous voulez utilisez le même objet, utilisez donc le C++ OOP et non le C Style Programming. –

Répondre

1

Vous pouvez transmettre une référence à la connexion à votre boîte de dialogue ou établir une connexion statique/globale.

e.g.1

class Dialog() 
{ 
    DBconnection &con; 
    Dialog(DBconnection &con) : con(con) {}; 
}; 

Au lieu d'une référence, vous pouvez également utiliser un std::shared_ptr.

Une bonne façon de faire la connexion globale/statique serait à travers le Service locator pattern. Ce modèle utilise un registre central connu sous le nom de "localisateur de service" qui, sur demande, renvoie les informations nécessaires pour effectuer une certaine tâche.

Vous pouvez également avoir un regard sur les choses liées à "Dependency injection"

+0

Est-il dans le Dialog.h ou Dialog.cpp je dois placer le code ci-dessus? –

+0

Vous devez ajouter 'DBconnection &con;' à votre en-tête dialog.h et vous devez modifier le constructeur de votre boîte de dialogue pour inclure l'argument de connexion et ajouter la connexion à la liste d'initialisation des membres de la classe constructors. – Lanting

+0

'shared_ptr' est un bon concept ici @Lanting, n'oubliez pas de détruire l'objet si vous n'utilisez pas' shared_ptr' –