2012-03-27 7 views
1

私は最近、C++ & Qtによるデータベースプログラミングの世界を掘り下げ始めました。質問があります。私は答えはおそらく非常に基本的ですが、私はそれを把握しているように見えることはできません知っている。メイン関数のデータベースに接続して他の関数から参照する方法

main関数でデータベースに接続し、それを他の関数から参照するにはどうすればよいですか?

基本的に、プログラムを最初に起動すると、メインウィンドウのインスタンスが作成されますが、表示する前に、後で実行するためにデータベースに接続します。私はウィンドウを表示します。偉大だが、接続名が関数の範囲外にあるため、データを入力してウィンドウを作成しようとすると、いいえ。

どうすればグローバルにすることができますか?私は主な機能の魔法使いのデータベースをすべてのクラスや関数から継承する必要があります(または少なくとも私は考えました)。

私はまだ学んでいるので、私はそれが継承がどのように働くかについてちょっとした誤解であると確信しています。

は、ここで私は私がデータベースから引き出されたデータを取り込むことができますドックを作成し、メインウィンドウの後に私の主な機能

int main(int argc, char *argv[]) 
{ 
QApplication a(argc, argv); 
MainWindow w; 

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
db.setHostName("LOCALHOST\\TestServer"); 
db.setDatabaseName("TestConnection"); 

w.show(); 


return a.exec(); 
} 

とあります。ここで私はメインウィンドウでクエリをプリフォームする必要がありましたです:: Createdock機能は

void MainWindow::createDockWindows() 
{ 
QDockWidget *rightDock = new QDockWidget(tr("Tasks"),this); 
rightDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); 

todoGroupBox = new QGroupBox(rightDock); 
todoGroupBox->setTitle(tr("To-Do List")); 

QSqlDatabase(db.open()); 
if (db.open()) 
{ 
    QMessageBox::information(this,"Connected","Connection to the Database was Established\n" 
          "\nStatus: Connected"); 
} 
else 
{ 
    QMessageBox::information(this,"Not Connected","Connection to the Database could not be Established\n" 
          "\nStatus: Not Connected"); 
} 

todoList = new QListWidget(todoGroupBox); 
todoList->addItems(QStringList() 
     << "Install Outlook on Jessies Computer" 
     << "Purchase 2 Licenses of Adobe Suite" 
     << "Contact UPS to put in a ticket to their IT dept."); 

addToDoLabel = new QLabel; 
addToDoLabel->setText(tr("Sample Text")); 
addToDoButton = new QToolButton; 
addToDoButton->setIcon(QIcon(":/images/gedit-icon.png")); 
addToDoButton->setToolTip(tr("Create a new task")); 
addToDoButton->setShortcut(tr("Ctrl+Shift+t")); 

QHBoxLayout *todoButtonLayout = new QHBoxLayout(); 
todoButtonLayout->addWidget(addToDoLabel,0,Qt::AlignRight | Qt::AlignVCenter); 
todoButtonLayout->addWidget(addToDoButton,0,Qt::AlignRight | Qt::AlignTop); 

QVBoxLayout *todoLayout = new QVBoxLayout(); 
todoLayout->addWidget(todoList,0,Qt::AlignCenter); 
todoLayout->addLayout(todoButtonLayout,0); 

todoGroupBox->setLayout(todoLayout); 
todoGroupBox->setMaximumSize(todoGroupBox->sizeHint()); 

} 
+1

データベースの接続はグローバルで、プレーンなデフォルトのものを使用し、複数の接続を使用しない場合は「うまく動作します」。コードの関連する部分を見ずに間違っていることを知ることはできません。 – Mat

答えて

2

QTでこれを行うための最も簡単な方法は、データベース接続に名前を付けるために、次のようになります。

あなたはaddに使用してデータベースを作成する場合QTでは、データベース接続名を指定してaddDatabase()と呼ぶことができます。その場合、いずれのクラスでもdatabase()を使用し、main()で作成したハンドルまたはコード内の他の場所に静的なデータベースハンドルを提供します。

db = QSqlDatabase::addDatabase("QODBC", "MyDB"); 
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb"); 
if (db.open()) { 
    // success! 
} 

は次にどこかのコードで、あなたが行うことができます:あなたが上記の開いた1へのハンドルを与える

QSqlDatabase localdb = QSqlDatabase::database("MyDB"); 

を。

+0

私はあなたが意味するものの例を見ることができます、ごめんなさい、私はまだC + +とqtとdbのプログラミングに新しいです。あなたは本当にQDatabase()関数を意味するのですか?私はデータベースだけを見つけることができないので、データベースにアクセスするためのパラメータを正しく入れるにはどうしたらいいですか?彼らは単に "db"になりますか? – Rob

+0

@Rob回答を修正しました – Karlson

+0

私はまだそれを働かせることはできません。私は、エラー文字列をポップアップに追加し、ドライバがロードされていないと言います。それが誰になるのか誰にも分かりますか? – Rob

関連する問題