# Implementação e Recursos Específicos do Qt

### **Uso do Qt Creator** <a href="#cn23ovae9kcq" id="cn23ovae9kcq"></a>

O projeto foi desenvolvido no Qt Creator devido às suas vantagens específicas para o desenvolvimento em C++ com Qt. O Qt Creator é uma IDE poderosa que oferece:

* **Integração Completa com Qt:** Ferramentas integradas para design de interfaces gráficas, suporte a signals e slots, e gerenciamento de recursos.
* **Facilidade de Depuração:** Ferramentas avançadas de depuração que ajudam a identificar e corrigir erros rapidamente.
* **Gerenciamento de Projetos:** Suporte nativo ao CMake, facilitando a configuração e construção do projeto.
* **Documentação e Exemplos:** Acesso fácil à documentação do Qt e exemplos de código diretamente na IDE.

### **Herança das Classes do Qt** <a href="#u0enu2imxtds" id="u0enu2imxtds"></a>

Todas as classes do projeto herdam de QDialog, QObject, QWidget ou QMainWindow, dependendo do caso, para aproveitar os benefícios oferecidos pelo Qt:

* **QDialog:** Utilizado para janelas de diálogo, como cadastro de pacientes e colaboradores.
* **QWidget:** Base para componentes visuais personalizados.
* **QMainWindow:** Utilizado para a janela principal da aplicação.
* **QObject:** Base para todas as classes que utilizam o sistema de signals e slots do Qt.

### **Como Funcionam os Sinais e Slots** <a href="#mv3i5mohflbn" id="mv3i5mohflbn"></a>

O sistema de **signals e slots** é um dos pilares do framework Qt para comunicação entre objetos. Ele permite que objetos interajam de forma desacoplada, facilitando a criação de interfaces dinâmicas e reativas.

#### **Definição de Conceitos** <a href="#id-7mru4zyhjyw3" id="id-7mru4zyhjyw3"></a>

* **Sinal (signal):** Um sinal é definido na seção signals: de uma classe no Qt, geralmente uma classe derivada de QObject.
* **Slot:** Slots são funções chamadas automaticamente quando um sinal correspondente é emitido. Eles são definidos como funções membros.

**Conexão:** Para conectar um sinal a um slot, utilizamos o método connect().\
connect(emissor, SIGNAL(sinal()), receptor, SLOT(slot()));

* **Emissão do Sinal:** Para emitir um sinal, usa-se emit. Quando o sinal é emitido, todos os slots conectados são executados.

#### **Exemplo: Classe Paciente** <a href="#hx7y6j967xk6" id="hx7y6j967xk6"></a>

**Definição de Sinal na Classe Paciente:** A classe Paciente emite o sinal pacienteCadastrado(int id) quando um paciente é salvo no banco:

signals:

{% code title="pessoa.h" %}

```cpp
void pacienteCadastrado(int id);
```

{% endcode %}

**Emissão do Sinal:** O sinal é emitido após a execução bem-sucedida do cadastro no banco:

{% code title="pessoa.cpp" %}

```cpp
if (query.exec()) 
{
    emit pacienteCadastrado(query.lastInsertId().toInt()); // Emite o ID gerado para o paciente
    return true;
} else {
    return false;
}
```

{% endcode %}

**Conexão do Sinal ao Slot:** No construtor da classe cadastroPacientes, o sinal emitido pelo objeto Paciente é conectado ao slot pacienteCadastrado:

{% code title="cadastropacientes.cpp" %}

```cpp
connect(&paciente, &Paciente::pacienteCadastrado, this, &cadastroPacientes::pacienteCadastrado);
```

{% endcode %}

**Conexão com a Janela Principal (MainWindow):** A conexão também é feita na classe MainWindow:

<pre class="language-cpp" data-title="mainwindow.cpp"><code class="lang-cpp">bool connected = connect(&#x26;cadastramento, &#x26;cadastroPacientes::pacienteCadastrado,
this, &#x26;MainWindow::adicionarPacienteNaTabela);
<strong>
</strong><strong>if (!connected) {
</strong>    qDebug() &#x3C;&#x3C; "Erro ao conectar o sinal pacienteCadastrado";
}
</code></pre>

**Reação ao Sinal (MainWindow::adicionarPacienteNaTabela):** Quando o paciente é cadastrado com sucesso, o slot adicionarPacienteNaTabela(int id) é executado, carregando os dados diretamente na QTableWidget:

{% code title="mainwindow\.cpp" %}

```cpp
void MainWindow::adicionarPacienteNaTabela(int id) 
{
    QSqlQuery query;
    query.prepare("SELECT * FROM tb_pacientes WHERE id = :id");
    query.bindValue(":id", id);
    
    if (query.exec() && query.first()) {
        int linha = ui->tw_pacientes->rowCount();
        ui->tw_pacientes->insertRow(linha);
        for (int i = 0; i <= 8; i++) {
            ui->tw_pacientes->setItem(linha, i, new QTableWidgetItem(query.value(i).toString()));
        }
        redimensionarTable(ui->tw_pacientes);
    } else {
        QMessageBox::warning(this, " ", "Erro ao carregar o novo paciente.");
    }
}
```

{% endcode %}

### **Diagrama de Comunicação das Classes via Signals e Slots** <a href="#euybx4kgw2ap" id="euybx4kgw2ap"></a>

<figure><img src="https://3366139412-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeeAOLeQ3Vlu5f0SatB7B%2Fuploads%2Fl9xIUH8IudaiSf7Rg0pG%2Fdiagrama2.png?alt=media&#x26;token=645e82ef-5d9c-40e7-9f8e-01b24703ad31" alt=""><figcaption></figcaption></figure>
