===== Qt e i database ===== Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//10/06/2013//** \\ \\ {{programmazione:qt:qt-postgres.png|}} Le librerie Qt comprendono anche un valente driver per interagire con molti tipi di database, fra i quali MySql, Postgres, Sqlite. Il fatto di poter abbinare le librerie QT ad un potente strumento di sviluppo RAD come Qt Creator rende le QT un ottimo strumento di sviluppo per applicazioni che fanno uso di basi di dati. ===== Codice per mostrare il risultato di una select ===== Con il seguente estratto di codice andremo a mostrare il risultato di una SELECT fatta su una tabella Postgres. Il risultato verra' mostrato all'interno di un widget di tipo tableView. L'interfaccia grafica e il codice per richiamare gli SLOT sono tutti stati generati con QTCreator. \\ Al click del pulsante "Connetti" (di nome pushButton) avverra la connessione al db. void MainWindow::on_pushButton_clicked() { QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL7"); db.setHostName("192.168.1.2"); db.setDatabaseName("QT_test"); db.setUserName("postgres"); db.setPassword(""); if (db.open()) { ui->statusBar->setStatusTip("Connessione stabilita con successo."); qDebug() << "Connessione stabilita con successo."; //Costruisco il modello per la griglia (inserisco le colonne) QStandardItemModel *model = new QStandardItemModel(); model->setHorizontalHeaderItem(0, new QStandardItem(QString("ID"))); model->setHorizontalHeaderItem(1, new QStandardItem(QString("Cognome"))); model->setHorizontalHeaderItem(2, new QStandardItem(QString("Nome"))); model->setHorizontalHeaderItem(3, new QStandardItem(QString("E-mail"))); //Abbino modello alla griglia ui->tableView->setModel(model); //Query per prelevare i dati QSqlQuery query("SELECT id, cognome, nome, email FROM users",db); //Ciclo per iterare i record trovati dalla select int rowIndex=0; while (query.next()) { // In "query.value(0).toString()" è il contenuto della cella 0, in "query.value(1).toString()" // quella della cella 1 e così via... //Inserisco le celle prelevando il contenuto dal database QStandardItem *Cell0 = new QStandardItem(QString(query.value(0).toString())); model->setItem(rowIndex,0,Cell0); QStandardItem *Cell1 = new QStandardItem(QString(query.value(1).toString())); model->setItem(rowIndex,1,Cell1); QStandardItem *Cell2 = new QStandardItem(QString(query.value(2).toString())); model->setItem(rowIndex,2,Cell2); QStandardItem *Cell3 = new QStandardItem(QString(query.value(3).toString())); model->setItem(rowIndex,3,Cell3); rowIndex++; } db.close(); }else{ //Modi diversi per segnalare un errore ui->statusBar->setStatusTip("Impossibile stabilire una connessione."); qDebug() << "Impossibile stabilire una connessione."; QMessageBox::critical(0, qApp->tr("Impossibile aprire il database"), qApp->tr("Impossibile stabilire una connessione.\n"), QMessageBox::Cancel,QMessageBox::NoButton); } } ===== Codice necessario per eseguire una insert ===== Con il codice seguente, invece, andremo ad eseguire una insert nel nostro db. void Dialog::on_cmdAggiungi_clicked() { QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL7"); db.setHostName("192.168.1.2"); db.setDatabaseName("QT_test"); db.setUserName("postgres"); db.setPassword(""); if (db.open()) { qDebug() << "Connessione stabilita con successo."; //Query per prelevare i dati QSqlQuery query("INSERT INTO users( cognome, nome, email ) VALUES \ ('"+ui->txtCognome->text()+"', '"+ui->txtNome->text()+"', '"+ui->txtEmail->text()+"');",db); db.close(); }else{ //Modi diversi per segnalare un errore qDebug() << "Impossibile stabilire una connessione."; QMessageBox::critical(0, qApp->tr("Impossibile aprire il database"), qApp->tr("Impossibile stabilire una connessione.\n"), QMessageBox::Cancel,QMessageBox::NoButton); } //Chiudiamo la finestra in ogni caso this->close(); }