DB02 – Exemplos de escrita de uma aplicação para Acesso a Base de Dados

Com mais este exemplo, pretendo demonstrar alguns aspetos elementares acerca da ligação a uma base de dados MySQL utilizando a framework Qt.

Esta framework Qt disponibiliza um conjunto de classes (vistas/views) que, baseando-se na Arquitectura Modelo/Vista (Model/View Architecture), possibilitam a fácil manipulação dos dados, bem como a forma como estes são apresentados ao utilizador.

A base teórica em que assenta esta arquitectura é a MVC ( model–view–controller ), popularizada pela linguagem Smalltalk.
No caso do Qt, o papel desempenhado pelo controller é substituído por uma forma diferente de abstracção, o delegate.
A informação sobre este tipo de abordagem pode ser consultada em : http://qt-project.org/doc/qt-5.0/qtwidgets/model-view-programming.html

O exemplo DB02 consiste na utilização de uma janela principal (QMainWindow), através da qual podemos estabelecer/terminar a ligação à base de dados, bem como aceder aos dois formulários (QDialog) que, possibilitam as edição dos dados nas duas tabelas relacionadas, cujo modelo é representado na figura seguinte:

Como testar o exemplo?

#1 – obter o código fonte e a respetiva base de dados

Download do ficheiro

Vamos obter duas pastas. Uma contendo a base de dados (database), a outra contendo a aplicação (db02app).

#2 – preparar a base de dados

A pasta “database” contém o modelo da base de dados, que foi elaborado utilizando o MySQL Workbench.

Basta abrir o ficheiro e executar a opção “forward engineer…” para automaticamente criar no nosso servidor MySQL os seguintes itens:

  • uma base de dados com o nome db02 e contendo  as tabelas representadas a imagem, bem como a respetiva ligação;
  • o utilizador userdb02 e palavra-passe 123, com privilégios de acesso a essa base de dados;
  • alguns dados pré-preenchidos na tabela de localidades.

#3 – executar e testar a aplicação

O vídeo seguinte faz uma pequena demonstração do funcionamento deste pequeno exemplo.

Compreendendo o código!

#1 – como e quando é estabelecida a ligação com a base de dados?

Uma ligação a uma base de dados é feita criando um objeto da classe QSqlDatabase.

No nosso exemplo este objeto é designado por db e a respetiva ligação por connection1.

db = connection(*dbInfo);
db->open();

Uma vez criado o objeto, e aberta a ligação com sucesso, estamos prontos a interagir com a base de dados.

A função connection recebe todas as informações necessárias, como o endereço do servidor, a base de dados, o utilizador e palavra-passe, bem como o nome a dar à ligação. Com estes elementos, a função cria o objeto da ligação e associa-o  a db.

QSqlDatabase* MainWindow::connection(QStringList connectionInfo)
{
    QSqlDatabase *db = new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL", (connectionInfo.at(4))));
    db->setHostName(connectionInfo.at(0));
    db->setDatabaseName(connectionInfo.at(1));
    db->setUserName(connectionInfo.at(2));
    db->setPassword(connectionInfo.at(3));
    return db;
}

#2 – como são criados os modelos de acesso aos dados?

Neste caso vamos ter dois modelos de acesso aos dados:

  1. O primeiro, mais simples,  para a tabela de localidades apenas. Através deste poderemos inserir novos registos na tabela onde estão armazenadas as localidades.
  2. O segundo, por relacionar duas tabelas, pode tornar-se m pouco mais complexo. Neste poderemos adicionar novos registos correspondentes a pessoas, sendo o campo relativo à localidade obtido a partir da tabela respetiva.

O modelo de acesso à tabela localidade resume-se a:

QSqlTableModel* localidadeDialog::setupModel()
{
    QSqlTableModel *model = new QSqlTableModel(this, QSqlDatabase::database("connection1"));
    model->setTable("localidade");
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->setHeaderData(0, Qt::Horizontal, "CP");
    model->setHeaderData(1, Qt::Horizontal, "Localidade");
    model->select();
    return model;
}

O modelo de acesso à tabela pessoa resume-se a:

QSqlRelationalTableModel* pessoaDialog::setupModel()
{
    QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this, QSqlDatabase::database("connection1"));
    model->setTable("pessoa");
    model->setRelation(model->fieldIndex("Pessoa_idLocalidade"), QSqlRelation("localidade", "idLocalidade", "nomeLocalidade"));
    model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);
    model->setHeaderData(0, Qt::Horizontal, "Id");
    model->setHeaderData(1, Qt::Horizontal, "Nome");
    model->setHeaderData(2, Qt::Horizontal, "Localidade");
    model->select();
    return model;
}

#3 – como são criadas as “vistas”, através das quais o utilizador visualiza e manipula os dados?

De acordo com o funcionamento desta arquitetura de acesso às bases de dados, vamos definir a forma como os dados vão ser trabalhados ao nível da interface.

Neste caso, basta inserir um objeto da classe QTableView e, de seguida, criar um objeto deste mesmo tipo (vista), com as propriedades que entendermos necessárias, e fazer a respetiva ligação (vista a apontar para o objeto da Ui).

Para a tabela localidade temos:

QTableView* localidadeDialog::setupView()
{
    view = ui->tableView;
    view->setModel(model);
    view->setSelectionMode(QAbstractItemView::ExtendedSelection);
    QHeaderView * header = view->horizontalHeader();
    header->setStretchLastSection(true);    // Também pode se definido na Ui
    // Adicionar definições adicionais aqui ou diretamente na Ui
    //...
    return view;
}

Para a tabela pessoa temos:

QTableView* pessoaDialog::setupView()
{
    view = ui->tableView;
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
    view->horizontalHeader()->setSectionsMovable(true);
    // Adicionar definições adicionais aqui ou diretamente na Ui
    //...
    return view;
}

Nesta fase convém lembrar que, como estou a desenhar as interfaces com o Qt Designer, grande parte das propriedades podem ser definidas aí.

E mais não digo … é testar e aprender :)

Anúncios

4 thoughts on “DB02 – Exemplos de escrita de uma aplicação para Acesso a Base de Dados

      1. Valew cara! Te juro que não estava baixando, deve ter sido alguma instabilidade. Esse seu site é muito fera, estou dando uma fuçada no Qt e está me ajudando bastante! Valew mesmo!

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s