2017-09-18 11 views
0

私は、詳細を提供し、アプリケーションにログインし、データベースから詳細を取得する簡単なqtアプリケーションを作成しています。主に2つのフォーム(MainWindowとDialog)データベース接続を取得するために書かれています! 私はDBWindowクラスを使用して、MainWindowフォームから詳細を入力してアプリケーションにログインしました!私はMainWindowフォームで開いた接続を維持する方法を知らず、それを使ってダイアログフォームのテーブルビューにデータを取得します。Qtを使用してsevaralフォームのための共通データベース接続を作成する

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

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(正常作動)(正常作動)

DBconnection.hを(次のように

mycodeであります動作していません)

void Dialog::on_pushButton_clicked() 
{ 
    QSqlQueryModel *modal = new QSqlQueryModel(); 
    con.connOpen(); 

    QSqlQuery* qry=new QSqlQuery(con.mydb); 


    qry->prepare("select NAME FROM TEST1"); 
     qry->exec(); 
     modal->setQuery(*qry); 
     ui->tableView->setModel(modal); 

} 

私はメインウィンドウのフォームからの接続からダイアログ形式でtablewidgetにデータを取得できるように、どのように私は私のコードを調整することができますか?

+0

に関連したものに外観を持っている場合がありますhttps://docstore.mik.ua/orelly/linux/sql/ch13_02.htmあなたがしたいです同じオブジェクトを使用するので、CスタイルのプログラミングではなくC++のOOPを使用してください。 –

答えて

1

ダイアログへの接続への参照を渡すことも、接続を静的/グローバルにすることもできます。代わりに、参照の

e.g.1

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

、あなたもstd::shared_ptrを使用する場合があります。

接続をグローバル/静的にする良い方法はService locator patternです。このパターンでは、「サービスロケータ」と呼ばれる中央のレジストリを使用します。このレジストリは、要求に応じて特定のタスクを実行するために必要な情報を返します。

また、あなたはこのを探していると思う"Dependency injection"

+0

Dialog.hまたはDialog.cppにありますか?上記のコードを配置する必要がありますか? –

+0

dialog.hヘッダに 'DBconnection &con;'を追加する必要があります。ダイアログのコンストラクタを変更して接続引数を組み込み、コンストラクタクラスのメンバ初期化子リストに接続を追加する必要があります。 – Lanting

+0

'shared_ptr'はここでは良い概念です@Lanting、また' shared_ptr'を使用していない場合はオブジェクトを破壊することを忘れないでください –

関連する問題